`

关于二叉树,我们的中国特色

阅读更多

国内关于数据结构的教材,不可不提严蔚敏的《数据结构-C语言实现》这本书。想必科班出身的,尤以考研族甚为熟悉。可谓国内权威教材。本人刚考完研,其内容自然是读过不下3遍。其内容非常基础,乃是介绍了数据结构的基本内容,作为广大程序员的入门教材,却也足够。语言许多地方有些晦涩,但认真推敲也无较大瑕疵。本人也看过耿国华版本的《数据结构》,与前者差别不大,语言更加亲和,但深度广度不及严版。

       最近钻研CLRS,以求在数据结构与算法方面更进一步学习,着实发现国外教材的严谨,全面,严奶奶着实不及。也发现前路漫漫,其修远兮,我必须上下而求索。也发现了一些中外教材定义上不一致的地方,尤以树这个方面比较突出。

一些差别:

1.深度,高度的定义

在严教材中,对深度和高度有如下定义(P120):

       结点的层次从根开始定义起,根为第一层,根的孩子为第二层。若某结点在第l层,则其子树的根就在第l+1层。......树中结点的最大层次称为树的深度高度


而在CLRS中,却有不同的定义(附录B.5.2,P672):

      从根r到结点x的路径长度称为x在T中的深度。结点在树中的高度是从结点向下到某个叶结点最长简单路径中边的条数。而树的高度也等于树中结点的最大深度。


严版的定义深度和高度等价,作为树的属性。而CLRS中深度与高度“互补”其和为树的深度(高度),对于树,也有高度的属性。

如右图:

如严版定义,根结点A的层次为1,B、C层次为2,以此类推,而二叉树的深度(高度)为5.

若如CLRS中定义,根结点A的深度为0,高度为4,而树的高度为4.


2.满二叉树与完全二叉树的定义

严教材中满二叉树定义如下(P124):

           一棵深度为k且有2^k - 1个结点的二叉树称为满二叉树。


而在CLRS中,则有严重的差别(附录B.5.3 P672):

              满二叉树:每个结点或者是叶结点,或度数为2,不存在度为1的结点。


对于完全二叉树,严教材定义为(P124):

           可对满二叉树的结点进行编号,约定从根结点起,从左向右,从上至下。深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1到n的结点一一       对应时,称之为完全二叉树。(备注写道此定义版本众多,本书以此为准)。


CLRS中则为(附录B.5.3 P673):

             完全二叉树是所有的叶子结点都有相同深度,且所有内部结点度都为2.


在Wikipedia中,完全二叉树与国内定义一致,与CLRS中不同,如下:

        complete binary tree is a binary tree in which every level, except possibly the last, is completely filled, and all nodes are as far left as possible.


Wikipedia对perfect binary tree(完美二叉树)定义与国内的满二叉树相同,即:

A perfect binary tree is a full binary tree in which all leaves are at the same depth or same level, and in which every parent has two children.[1] (This is ambiguously also called a complete binary tree.)


CLRS英文版中对完全k叉树定义为:

CLRS中的完全二叉树定义与严版的满二叉树定义实质相同,都是指这样一棵二叉树:


但严版的完全二叉树与CLRS中的满二叉树则大有不同,前者可为:


这在CLRS中,则不是满二叉树,更不是完全二叉树。

对于上图,在CLRS定义中,均为满二叉树,但在严版教材中,只有右边的可称为完全二叉树。


对于这些差别,其实:

然而,许多这些差别是由于翻译问题造成的,请听我道来:

 

在Wikipedia中,完全二叉树与国内定义一致,如下:

        complete binary tree is a binary tree in which every level, except possibly the last, is completely filled, and all nodes are    as far left as possible.


Wikipedia对perfect binary tree(完美二叉树)定义与国内的满二叉树相同,即:

      A perfect binary tree is a full binary tree in which all leaves are at the same depth or same level, and in which every parent    has two children.[1] (This is ambiguously also called a complete binary tree.)


CLRS英文版中对完全k叉树定义为:

 

           A complete k-ary tree is a k-ary tree in which all leaves have the same depth and all internal nodes have degree k.


CLRS的译者们对complete的翻译没有考虑道英文定义中本来存在的歧义还有国内约定俗成的定义的忽视,造成了这样的混乱。国内的定义中满二叉树即为perfect binary tree,其翻译与full binary tree相近,wikipedia中对full binary tree的定义与CLRS中一致,即:

         full binary tree (sometimes proper binary tree or 2-tree or strictly binary tree) is a tree in which every node other than the   leaves has two children.Sometimes a full tree is ambiguously defined as a perfect tree.


但CLRS直接将 full binary tree翻译为满二叉树,与国内约定俗成的满二叉树(perfect binary tree)相冲突。这同样是忽略了国外定义存在的争议和国内约定俗成的说法而进行翻译。

总结一下对应关系:

 

国内 国外
完全二叉树 a complete binary tree
满二叉树 a perfect binary tree(a complete binary tree [ambiguously])
无对应名称,即全部结点度数要么为2,要么为0的二叉树 a full binary tree(sometimes called a perfect binary tree[ambiguously])


 


我想说的:

       物理学与计算机科学都与数学有着最紧密的关系。但与物理学基于客观存在的、不随主观意志改变的宇宙不同,计算机科学是关于我们千千万万的程序员、计算机科学家、黑客们创造的新的世界运行规律的科学,这些规律,具体表现为形形色色的协议、算法,是我们人类制定的。所以争议一直会存在。许多没有实质差别的争议,如大端法与小端法,如从0开始计数和从1开始,只是一个标准问题。

       CLRS是一部庞大的书,英文版有近1000页,翻译的难度与工作量可想而知。但也希望译者们能充分考虑到英文定义中本来存在的争议和国内相关约定俗成的说法,为一份标准献一份力量。

       从中也能看出国内教材往往立意较浅,从实用角度介绍了许多重要的数据结构,严教材充斥着略显蹩脚的C代码,语言也有些晦涩,也是国内大学的氛围所致,但作为入门级读物已经是非常不错,它的练习册也很好。而CLRS则从数学的根基开始力图构建一个涉及广泛的重要的结构和算法的高楼大厦,从实际效果看,他成功达到了他的目标。他严谨,稳重,甚至稍有笨重。希望对结构与算法,对计算机科学有心趣的同学能够跟我一起学习。在此推荐一个豆列:http://book.douban.com/doulist/229594/ 希望对你有所帮助。

分享到:
评论

相关推荐

    二叉树二叉树二叉树二叉树二叉树

    二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树

    关于二叉树的链式存储

    关于二叉树的链式存储,里面有二叉树的一些操作,

    二叉树排序二叉树排序

    二叉树排序二叉树排序二叉树排序二叉树排序二叉树排序二叉树排序二叉树排序

    二叉树---数据结构

    二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树

    二叉树_二叉树遍历_

    1.二叉树的基本操作实现【问题描述】建立一棵二叉树,用递归方法实现二叉树的如下基本操作:(1)按先序序列构造一棵二叉链表表示的二叉树T;(2)对这棵二叉树进行遍历:先序、中序、后序以及层次遍历,分别输出...

    关于二叉树的一些操作(C源码)

    关于二叉树的一些操作的C语言实现,包括二叉树的创建,各种顺序的遍历,有关节点的计算等一系列操作,本代码已在VS2008,VC++6.0运行通过

    判断二叉树是否是完全二叉树

    编写算法判别给定二叉树是否为完全二叉树。

    总结的关于二叉树的所有操作(经典程序)

    总结面试中出现的所有关于二叉树的操作,包括二叉树的深度优先遍历、广度优先遍历,二叉树的各种建立方式(递归和非递归都有),以及先序、中序、后序遍历的递归和非递归算法的总结。

    二叉树建立 二叉树基本算法的实现

    (2)先序、中序、后序遍历二叉树:递归算法。 (3)中序遍历二叉树:非递归算法(最好也能实现先序,后序非递归算法)。 (4)求二叉树的高度 。 (5)求二叉树的叶子个数。 (6)对于树中每一个元素值为x的结点...

    关于二叉树前序和后序的非递归遍历算法.rar

    关于二叉树前序和后序的非递归遍历算法.rar

    关于二叉树结构的一个应用小实例

    假设以如下说明的三元组 (F、C、L/R) 序列输入一棵二叉树的诸边(其中 F 表示双亲结点的标识,C 表示孩子结点标识,L/R 表示 C 为 F 的左孩子或右孩子),且在输入的三元组序列中,C 是按层次顺序出现的。设结点的标识...

    判断二叉树是否为完全二叉树

    在二叉树类binarytree中增加一个功能,判断是否为完全二叉树(使用自定义的队列类完成)

    关于二叉树的建立遍历查找程序代码

    这是一段关于二叉树的程序,有建立,后续遍历,层次遍历,查找结点,打印祖先等操作

    北航ACM高人写的关于二叉树的一些操作

    北航ACM高人写的关于二叉树的一些操作,实现了二叉树主要的功能

    中序线索二叉树(建立二叉树,线索化,输出二叉树)

    中序线索二叉树(建立二叉树,线索化,输出二叉树)

    二叉树的基本算法

    (1) 根据屏幕提示输入二叉树的各个结点,并建立该二叉树; (2)选择某种遍历方式输出该二叉树; (3)求该二叉树的叶子结点数; (4)求该二叉树的高度; (5)将该二叉树中所有结点的左、右子树相互换,并输出。

    二叉树2.dsw

    二叉树的基本功能实现,你二叉树的基本功能实现,你二叉树的基本功能实现,你二叉树的基本功能实现,你二叉树的基本功能实现,你二叉树的基本功能实现,你二叉树的基本功能实现,你二叉树的基本功能实现,你二叉树的...

    二叉树模板代码 二叉树习题

    二叉树模板代码 二叉树 作业习题 二叉树模板代码 二叉树 作业习题 二叉树模板代码 二叉树 作业习题

    二叉树的建立与基本操作

    编写程序实现二叉树的如下操作: 1) 建立二叉链表 2) 二叉树的先序、中序、后序遍历 3) 求解二叉树的叶子结点个数 4) 将二叉树中所有结点的左、右子树相互交换 输入:  扩展二叉树先序序列:ab#d##ce###。其中#...

    二叉树的基本运算

    建立一棵二叉树,试编程实现二叉树的如下基本操作: 1. 按先序序列构造一棵二叉链表表示的二叉树T; 2. 对这棵二叉树进行遍历:先序、中序、后序以及层次遍历,分别输出结点的遍历序列; 3. 求二叉树的深度/结点数目...

Global site tag (gtag.js) - Google Analytics