树 内部/外部结点 深度/高度 满二叉树/完全二叉树
最近在复习树的过程中,发现不同的教材和公开课对于树的一些基本概念定义不一,个人原来的理解也混乱;
这里对这些做一下记录,并从这些定义中选取使用更广泛或更合理的定义作为后续学习依据,避免懵逼;
node:翻译为结点
还是节点
?
在《数据结构与算法分析·C语言描述》一书中,将node翻译为节点;
《大话数据结构》一书中,将node翻译为结点;
浙江大学 陈越等 的《数据结构》公开课中将node翻译为结点;
参考链接:是目录树结点 还是 目录树节点????
个人觉得翻译为结点更为靠谱,当然,就如古有通假字一说,node约定俗成地翻译为节点也可,也算是中国特色吧,这点也无需特别关注;
内部结点(Branch/Internal node)
和外部结点(External node)
在某些教材和公开课中,经常会见到内部结点
和部结点的
说法,但对其定义貌似都不同,让人一脸懵逼:
维基百科的定义:
内部结点:至少有一个孩子的结点,与分支结点定义相同;
Branch node/Internal node:A node with at least one child.
外部结点:也即叶子结点;有趣的是,维基百科关于外部结点的定义特地标注了不统一
;
Leaf/External node (not common):A node with no children.
《大话数据结构》:
结点拥有的子树个数称为结点的度(Degree),度为0的结点为叶结点(Leaf)或终端结点;度不为0的结点称为非终端结点或分支结点;除根结点外,分支结点也称为内部结点;树的度是树内各结点度的最大值;
与维基百科
定义区别:认为根结点不是内部结点;
维基百科的定义更为常用,也更加合理(将根结点单独拎出来没有意义),采用之;
深度
与高度
这个的定义不一,可能很多人都知道:高度和深度到底是从0开始还是从1开始?这是一个问题
可以参考:树的高度于深度不一样,高度从1数起,深度从0数起,对吗?
维基百科的定义:
Level:The level of a node is defined as: 1 + the number of edges between the node and the root.
层次:1+结点到根结点的路径长度(边的个数);
Depth:The depth of a node is defined as: the number of edges between the node and the root.
深度:结点到根结点的路径长度(边的个数);
Height of node:The height of a node is the number of edges on the longest path between that node and a leaf.
高度:结点到叶结点的路径长度(边的个数);
Height of tree:The height of a tree is the height of its root node.
树的高度:根结点的高度;
按照维基百科的定义,叶子结点的高度为0;根的深度为0;除了高度(Height)这个定义外,还有一个层次(Level)的概念,根的层次为1;也就是说高度和深度均从0开始,层次从1开始;
《数据结构与算法分析·C语言描述》一书中与维基百科相同;
浙江大学公开课:
层次:规定根结点在第1层,其他任一结点的层数是其父结点的层数加1;
树的深度:树中所有结点中的最大层次;
树的高度:并没有明确提出定义,但是从习题来看,也是从1开始;
《大话数据结构》一书中也将深度与高度均定义为层次一致,从1开始;
由于国内常用,所以接受层次
、高度
和深度
均从1开始的定义.但是注意区分,高度是从叶子结点开始算,而深度和层次是从根结点开始算;
满二叉树(full binary tree)和完全二叉树(complete binary tree):
参考链接:为什么说“满二叉树也是完全二叉树”?
数据结构公开课 北京大学·张铭 bilibili:
满二叉树:如果一颗二叉树的任何结点,或者是树叶,或者恰有两颗非空的子树,则此二叉树称作满二叉树;
完全二叉树:最多只有最下面的两层结点的度数可以小于2,且最下一层的结点都集中在最左边;
《大话数据结构》:
在一颗二叉树中,如果所有分支结点均存在左子树和右子树,且所有叶子结点在同一层上,这样的二叉树称为满二叉树;
对一颗具有n个结点的二叉树按层序编号,如果编号为i(1<=i<=n)的结点与同样深度的满二叉树编号为i的结点在二叉树中位置完全相同,则这颗二叉树称为完全二叉树;
满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树;
浙江大学公开课:
完全二叉树:有n个结点的二叉树,对树中结点按从上至下、从左至右编号,编号为i(1<=i<=n)结点与满二叉树中编号为i结点在二叉树位置相同;
满二叉树:没有明确提出,但是从PPT来看,定义与《大话数据结构》中满二叉树相同;
在浙江大学的公开课中,定义其实与《大话数据结构》中的定义相同;
在国内的网上(GFW内),后面一种定义更为常用,采用之;
总结
其实上述的这些区别仅仅在于定义,对我们研究数据结构原理帮助有限,但是这些定义不一的确会给学习者带来一些理解障碍,这里做一下整理,也给自己一个明确的定义;
如果一颗树的高度是0,那么到底是空树还是只有一层的结点的树呢?
我的定义是空树,你的呢?