定义
二叉树( binary tree )是有限节点集合构成的结构,其结构的递归定义为:
- 三个不相交的节点集合构成,一个作为根节点,一个节点集构成的二叉树作为根节点的左子树,另一个节点集构成的二叉树作为根节点的右子树
- 当节点数为零时,表示二叉树为空
所以节点个数为零的空树也是二叉树,二叉树根节点的左、右子树也是二叉树,其结构同样符合以上定义,当左子树为空树时,表示根节点没有左子节点。且二叉树区分左、右子树,以下两个二叉树为不同的二叉树。
结构特性
首先说明下几个概念:
- 根节点: 没有父节点的节点;
- 叶子节点: 没有子节点的节点;
- 节点的度 :节点的分支个数,二叉树每个节点的分支个数为 0~2;
- 路径:连接节点和后代子节点之间的不重复边;
- 节点的深度:从根节点到该节点的路径长;
- 节点的高度:从该节点到叶子节点的最大路径长;
- 节点的层数:父节点的层数加一;
- 树的高度:根节点高度。
- 树的深度:叶子节点深度的最大值。
关于高度和深度的起始值 0 或 1 的个人看法:
对于深度、高度和层数的起点值,可能有些地方基数是从1开始计算的。对于这个起点值的设置,个人觉得如果你高兴,从10086开始也无妨,因为在应用中,这些数据量只是为了方便计算,起作用的只是相对值而已。
为了方便理解,这里设置基数为0,深度可以认为是从水平面,也就是0深度,往下有几层,深度就是几;高度类似理解,地平面是0,往上有几层,高度就是几。
参考下图:
图片来源:What is the difference between tree depth and height?
满二叉树、完全二叉树、完美(理想)二叉树
关于完全二叉树和满二叉树的定义,因为最初翻译的不同,已经混淆很久了,所以已经属于一个历史问题了。这里尽量不去分辨哪一种定义是正确的,只按照个人的理解去描述。
- 满二叉树( Full Binary Tree ):
每个节点的度为 0 或 2,即除了叶子节点,每个节点都有两个子节点。
示例:
- 完全二叉树( Complete Binary Tree ):
除深度最大的一层外,其他每层上的节点都是填充满的,且深度最大的一层节点分布从左向右是连续无间隔的。
示例:
- 完美/理想二叉树( Perfect Binary Tree ):
除叶子节点外,每个节点度都为 2,且叶子节点在同一层。
示例:
以上概念参考:
二叉树数据量
下面介绍二叉树几个数据量之间的关系,变量声明如下:
github
链接:二叉树