二叉树(Binary Tree)是n(n≥0)个节点的有限集合,n = 0时,该集合为空集合称为空二叉树,或者由一个根节点和两棵互不相交的,分别称为根节点的左子树和右子树的二叉树组成。
所有的节点都只有左子树的二叉树叫左斜树;所有节点都只有右子树的二叉树叫由斜树。这两者统称为斜树。斜树的特点很明显就是每一层只有一个节点,节点的个数与二叉树的深度相同。其实线性表可以理解为树的一种极其特殊的形式。
在一棵二叉树中,如果所有分支节点都存在左子树和右子树,并且所有的叶子节点都在同一层上,这样的二叉树称为”满二叉树“。如下图:
对于一棵具有n个节点的二叉树按照层序编号,如果编号为i(1≤ i ≤ n)的节点与同样深度的满二叉树中编号为i的节点在二叉树中位置完全相同,则这棵二叉树称为”完全二叉树“。如下图:
1、在二叉树的第i层上至多有2^(i-1)个节点(i≥1);比如第3层,至多有4个节点;
2、深度为k的二叉树至多有2^k - 1个节点(k≥1);
3、对任何一颗二叉树T,如果某终端节点数为n0, 度为2的节点数为n2,则n0 = n2 + 1;
4、具有n个节点的完全二叉树的深度log2(n) + 1 个(|X|表示不大于X的最大整数)。
5、如果对一棵有n个节点的完全二叉树的节点按层序编号,对任一节点i(1≤ i ≤ n)有:
(1)如果i = 1, 则节点i是二叉树的根;如果i > 1,则父节点是 i / 2 ;
(2)如果2i > n,则节点i是叶子节点,否则其左子节点是2i;
二叉树的顺序存储结构就是用一维数组存储二叉树中的节点,并且节点的存储位置,也就是数组下标要能够体现出节点之间的逻辑关系,比如父子关系、左右节点关系等。
对于如下图一棵完全二叉树:
顺序存储结构如下:
由于二叉树的每个节点最多有两个孩子,所以二叉链表的每个节点有一个数据域和两个指针域,指针域分别指向左子节点和右子节点。存储结构如下:
二叉树的遍历是指从根节点出发,按照某种次序依次访问二叉树中的所有节点,使得每个节点被访问一次且仅被访问一次。以下面所示的二叉树为例,分析各种遍历方式的结果。如下图:
先访问根节点,然后前序遍历左子树,再前序遍历右子树。
遍历步骤:
(1)先访问根节点A,结果为A;
(2)前序遍历根节点A的左子树,左子树的根节点是B,此时结果是AB;
(3)继续前序遍历以B为根节点的左子树,此时的根节点是D,结果为:ABD;
(4)继续遍历以D为根节点的左子树H,此时结果为:ABDH;
(5)节点H不存在左子树,则遍历以D为根节点的右子树,此时结果为:ABDHI;
(6)递归遍历以B为根节点右子树E,由于E存在左子树J,此时结果为:ABDHIE;
(7)E存在左子树,此时结果为:ABDHIEJ;此时根节点A的左子树遍历完成,开始遍历右子树;
(8)右子树根节点为C,此时结果为:ABDHIEJC;
(9)以C为根节点的子树存在左节点F,结果变为:ABDHIEJCF;
(10)节点F不存在子节点,遍历C的右节点,前序遍历最后结果为:ABDHIEJCFG;
先中序遍历根节点的左子树,然后访问根节点,再中序遍历右子树。
遍历步骤:
(1)根节点A存在左子树,先中序遍历以节点B为根节点的左子树;
(2)节点B存在左子树,中序遍历以节点D为根节点的左子树;
(3)节点D存在左叶子节点H,此时结果为:HD;
(4)节点D存在右叶子节点I,此时结果为:HDI;
(5)以节点B为根节点的左子树遍历完成,此时访问根节点B,结果为:HDIB;
(6)访问B节点的有子树,右子树根节点存在左节点J,此时结果为:HDIBJE;
(7)根节点A的左子树访问完成,访问根节点A,结果变为:HDIBJEA;
(8)遍历根节点A的右子树,右子树存在左叶子节点F,此时结果为:HDIBJEAF;
(9)然后访问右子树的根节点C,中序遍历最后结果为:HDIBJEAFCG;
先后序遍历根节点的左子树,然后后序遍历根节点的右子树,再访问根节点。
遍历步骤:
(1)根节点A存在左子树,先后续遍历以节点B为根节点的左子树;
(2)节点B存在左子树,后续遍历以节点D为根节点的左子树;
(3)节点D存在左叶子节点H,右子节点I,此时结果为:HID;
(4)节点B存在右子树,后续遍历以节点D为根节点的右子树;
(5)节点E存在左叶子节点,不存在右子节点,此时结果为:HIDJE;
(6)B节点的左子树、右子树遍历完成,访问B节点,结果为:HIDJEB;
(7)根节点的左子树遍历完成,后序遍历根节点的右子树,结果为:HIDJEBFGC;
(8)最后访问根节点,后序遍历最后结果为:HIDJEBFGCA;
从根所在的层开始,从上而下逐层进行遍历,在同一层中,按左到右的顺序对节点逐个访问。
遍历步骤:
(1)从第一层根节点开始访问,结果为:A;
(2)访问第二层,从左到右,结果为:ABC;
(3)访问第三层,结果为:ABCDEFG;
(4)访问第四层,层级遍历结果为:ABCDEFGHIJ;