一棵有中国特色的二叉树

转载请做声明:    原作者 edwardwjz

文章来源:http://mp.blog.csdn.net/postedit/78998577  



看到了一篇博文,写了中外计算机书中的一些概念比较,写得非常好。这让我想到了我在以前选修肖老师的《算法导论》课程的时候,有一节课上老师讲 PPT 上的概念,同学们出现了疑问,而疑问的焦点也就是定义的不同。在那篇博文的基础上加以我自己的理解以及补充,写在这里。

 

1,        开胃小菜:深度,高度的定义

在严蔚敏教材[1]中,P120有对深度和高度的定义:“结点的层次从根开始定义起,根为第一层,根的孩子为第二层。若某结点在第l层,则其子树的根就在第l+1层。......树中结点的最大层次称为树的深度高度”。


而在熟知的《算法导论》[2]中的定义则不同,附录B的 P689 :“从根 r到结点 x 的一条简单路径的长度即为 x 在 T 中的深度。 ......结点在树中的高度是指从该结点到叶结点最长的一条简单路径上边的数目”。


可以看到,前面两个定义在高度上不同,而这一点,在清华出版的殷人昆教材[3]中被点明了出来,书中P188定义则是“树的深度:树中距离根节点最远的结点所处的层次即为树的深度。空树的深度为0,只有一个根节点的树的深度为1”,  “树的高度:很多数据结构教科书定义树的高度等同于树的深度,本书则从下向上定义高度。叶结点的高度为1,非叶结点的高度等于它的子女结点高度的最大值加一,这样可定义树的高度等于根结点的高度。高度与深度计算的方向不同,但数值相等”。


上面这个图出自《算法导论》[2]。简单来讲,按照严版教材,某结点的深度和高度等价,而算法导论和殷人昆教材则是深度和高度“互补”,两者和为树的深度


2,丰富热菜:满二叉树和完全二叉树的定义:


严蔚敏的教材中对满二叉树的定义在 P124:“一棵深度为k且有2^k - 1个结点的二叉树称为满二叉树”。殷人昆的教材与之类似,P190:“满二叉树:深度为 k 的满二叉树是有2^k-1个结点的二叉树。在满二叉树中,每一层结点都达到了最大个数。除最底层结点的度为0外,其他各结点的度为2”。而在算法导论中则出现了较为大的定义上的差别P690:“满二叉树:每个结点是叶结点或者度为2。满二叉树不存在度为1的结点。”。



这里就非常有意思了,也就是说,如图上(出自算法导论P690)所示的这个树,如果圆圈表示内结点而方块表示的是叶子结点,由于每个内部节点度为2,不存在度为1的结点,则它是满二叉树。


再看完全二叉树的定义,也是很有区别。严蔚敏教材 P124写:“可以对满二叉树的结点进行连续编号,约定编号从根结点起,自上而下,自左至右。由此可引出完全二叉树的定义。深度为k的,有n 个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称之为完全二叉树。”殷人昆教材与这个定义类似P190:“如果一棵具有n个结点的深度为 k 的二叉树,它的每一个结点都与高度为 k 的满二叉树中编号为1~n 的结点一一对应,则称这棵二叉树为完全二叉树。......其特点是:上面从第1层到 k-1层的所有各层的结点数都是满的,仅最下面第k层或是满的,或从右向左连续缺若干结点”。    而在算法导论中,定义的区别就立刻显现出来P691:“完全二叉树是所有叶结点深度相同,且所有内部结点度为 k 的 k 叉树”。


重点来了。上面这个图出自算法导论 P691,可以看到算法导论中把这个树叫做了完全二叉树。但这个树在我们国内其实是所熟知的满二叉树。 


仅到此还不够。在维基百科中对完全二叉树的定义是与国内一样,与算法导论中文版不同“In a complete binary tree every level, except possibly the last, is completely filled, and all nodes in the last level are as far left as possible. It can have between 1 and 2^(h-1) nodes at the last level h ”这里定义就是我们所熟知的。


维基百科同一页面这一段的前一段是对 Perfect Binary Tree (完美二叉树)的定义:“perfect binary tree is a binary tree in which all interior nodes have two children and all leaves have the same depth or same level. (This is ambiguously also called a complete binary tree.) ”。可以看到,维基百科中对完美二叉树的定义则是国内的满二叉树。



 

对于上面这个图,我们所熟知的定义,右边是完全二叉树。而在算法导论[2]中,则都可以叫做满二叉树。


那么,重点来了,为何会有如此的区别呢? 那篇博文[5]在这个地方的解释写的非常好。博主写道:“这些差别是由于翻译问题造成的”。


从前面我们已经了解到维基百科对完全二叉树是和国内一样的定义。对Perfect Binary Tree(完美二叉树)是和国内满二叉树相同。而国内的满二叉树的定义与维基百科中 Full binary tree[4] 相近,“full binary tree (sometimes referred to as a proper or plane binary tree) is a tree in which every node in the tree has either 0 or 2 children.” 在那篇博文中引用的基百科后面有句This is ambiguously also called a complete binary tree)。而这句话在现在的维基百科上已经没有了。


算法导论原英文版对完全 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.


比较可能的就是,“算法导论的译者对 complete的翻译没有考虑到英文定义中本来存在的歧义还有国内约定俗成的定义的忽视,造成了这样的混乱。......将 full binary tree翻译为满二叉树,与国内约定俗成的满二叉树(perfectbinary tree)相冲突。这同样是忽略了国外定义存在的争议和国内约定俗成的说法而进行翻译[5]”


总结下来的对应关系:

国内教材国外
满二叉树PerfectBinary Tree (also ambiguously called complete binary tree)
完全二叉树CompleteBinary Tree
无名字(所有结点度数或者为0或者为2)FullBinary Tree


3,饭后点心:


学习操作系统时,在内存满的情况下决定应该换出哪个页面,会用到页面置换算法,算法有很多种,其中一种名字叫做 LRU, LeastRecently Used。很多书的翻译,包括CSAPP:《深入理解计算机系统》把它叫做“最近最少使用算法”。但是这样的翻译就有些歧义,让人初读甚为疑惑。另外有的翻译就叫做“最近最久未使用”就体现出来了一段时间上没有被用到的概念。

 


4,总结:


计算机科学发展到现在,有很多是人为制定的,比如大端小端问题。而这里就会有一些争议。翻译的不确切性也是争议的一个来源。但不得不说,翻译如算法导论一样厚的书必然是一个艰巨的任务,向这些译者们致敬。而我们自己,在学习这些时,遇到了这样的不确切性问题,就需要多加探索,加以整理,为自己做记录,为他人做引导。最后,希望本篇文章对你能有帮助,蟹蟹你的阅读。

 


文章参考来源:

[1] 《数据结构》  严蔚敏,吴伟民,清华大学出版社, 2009年 9月第30次印刷

[2] 《算法导论原书第3版》,机械工业出版社。

[3] 《数据结构(用面向对象方法与C++语言描述)(第二版)》  殷人昆,清华大学出版社,

[4] 维基百科,Binary Tree:  https://en.wikipedia.org/wiki/Binary_tree 

[5] 关于二叉树,我们的中国特色, skyline0623,  http://blog.csdn.net/skyline0623/article/details/7215968



我的个人公众号:河畔那家白粥馆


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CSP-J 第二轮考试的考点包括: 1. 数据结构:二叉树、图、堆、并查集等。 2. 算法:排序、查找、回溯、动态规划等。 3. 计算机网络:TCP/IP 协议、HTTP 协议、DNS 协议等。 4. 操作系统:进程、线程、死锁、虚拟内存等。 5. 计算机组成原理:CPU、内存、I/O 设备等。 6. 数据库:SQL、数据模型、数据库设计等。 7. 编程语言:Java、C++、Python 等。 这些考点是 CSP-J 第二轮考试的主要内容,具体考试内容以官方通知为准。 ### 回答2: CSP-J(中国计算机软件能力认证)是中国计算机技术职业资格认证中的一个项目,第二轮考试主要是针对Java语言的能力测试。在CSP-J第二轮考试中,主要有以下几个考点: 1. Java语言基础知识:包括Java的语法、关键字、标准类库等方面的知识点。考察学员对Java基本语法的掌握程度和使用能力。 2. 面向对象编程:考察学员对面向对象编程思想的理解和应用能力,包括类的定义、继承、多态、封装等方面的知识。 3. Java核心类库:考察学员对Java核心类库的熟悉程度和使用能力,包括集合类、IO操作、线程、异常处理等方面的知识。 4. 数据库操作:考察学员对Java语言与数据库的交互能力,包括对SQL语句的理解、数据库连接的建立、数据查询与更新等方面的知识。 5. 网络编程:考察学员对Java网络编程的理解和应用能力,包括TCP/IP协议、Socket编程、HTTP协议等方面的知识。 6. 设计模式:考察学员对常用设计模式的理解和应用能力,包括单例模式、工厂模式、观察者模式等方面的知识。 以上是CSP-J第二轮考试的主要考点,通过考试可以评估学员在Java语言方面的能力水平。为了取得优异的成绩,建议学员在这些考点上进行充分的准备和学习。 ### 回答3: CSP-J(程序设计能力全国联赛初级组)第二轮的考点相对于第一轮更加深入和复杂。以下是第二轮考点的介绍: 1. 数据结构:第二轮中,数据结构的考点是非常重要的。主要涉及树、图和其他常见数据结构,例如堆、栈和队列等。在这一部分,考生需要熟练掌握这些数据结构的特点、实现方法和应用场景。 2. 算法设计与分析:第二轮中,考生需要展示设计和分析高效算法的能力。这包括使用递归、贪心、动态规划、回溯、分治等算法思想解决问题的能力。考生需要对不同算法的时间复杂度和空间复杂度有较好的理解,并能够分析算法的优劣性。 3. 编程思维和技巧:在第二轮考试中,考生需要展示他们的编程思维和技巧。这包括对问题进行建模和抽象的能力,合理使用数据结构和算法的技巧,以及处理边界情况和异常情况的能力。 4. 综合应用题:第二轮的考试通常包含综合应用题,要求考生综合运用前面所学的知识解决实际问题。这类题目可能与现实生活中的问题相关,需要考生能够将问题转化为计算机程序,并给出正确有效的解决方案。 总体而言,CSP-J第二轮考点更加深入和复杂,需要考生具备扎实的数据结构和算法基础,以及良好的编程能力和解决问题的思维能力。需要进行更多的实践和练习,提升自己的编程水平和解题能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值