您的位置:首页 > 其它

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

2012-02-06 09:43 197 查看
国内关于数据结构的教材,不可不提严蔚敏的《数据结构-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中不同,如下:

A 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中,完全二叉树与国内定义一致,如下:

A 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中一致,即:

A 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: