二叉树的定义
二叉树(Binary Tree)是树形结构的一种,它的特点是每个节点最多有两个子节点,通常被称为左子节点(left child)和右子节点(right child)。二叉树可以是空集,若不为空,则是由一个根节点(root node)和两个不相交的、分别被称为左子树和右子树的二叉树组成。
二叉树与度为2的有序树的区别:
1.度为2的有序树至少有3个结点,二叉树可以为空;
2.度为2的有序树的孩子的左右次序是相对于另一个孩子而言的,若某个节点只有一个孩子就不用考虑次序,而二叉树无论其孩子数是否为2,均需确定其左右次序,因为二叉树的孩子节点的左右次序是确定的不是相对于另一个节点而言的。
二叉树的主要特性
-
递归定义:二叉树通过递归的方式定义,即二叉树由一个根节点和两个子二叉树组成,子二叉树也遵循相同的结构。
-
节点的度:在二叉树中,每个节点的度最大为2,即每个节点最多有两个子节点。
-
深度与高度:
- 深度:从根节点到最远叶子节点的最长路径上的节点数。
- 高度:从根节点到最远叶子节点的最长路径上边的数目(即节点数减一)。在某些情况下,高度和深度可互换使用,但通常深度包括根节点,而高度不包括。
-
叶子节点:没有子节点的节点称为叶子节点(leaf node)。
-
非叶子节点(内部节点):具有至少一个子节点的节点称为非叶子节点或内部节点(internal node)。
-
满二叉树:一个二叉树,如果每一层的节点数都达到最大值,则称为满二叉树。也就是说,除了叶子节点外,每个节点都有左右两个子节点。
-
完全二叉树:
若设二叉树的深度为h,除第h层外,其它各层(1~h-1)的节点数都达到最大个数,第h层所有的节点都连续集中在最左边,这样的二叉树则被称为完全二叉树。
①若 i ≤⌊ n /2⌋,则结点 i 为分支结点,否则为叶结点。
②叶结点只可能在层次最大的两层上出现。对于最大层次中的叶结点,都依次排列在该层最左边的位置上。
③若有度为1的结点,则最多只可能有一个,且该结点只有左孩子而无右孩子。④按层序编号后,一旦出现某结点(编号为 i )为叶结点或只有左孩子,则编号大于 i 的结点均为叶结点。
若 n 为奇数,则每个分支结点都有左孩子和右孩子;若 n 为偶数,则编号最大的分支结点(编号为 n /2)只有左孩子,没有右孩子,其余分支结点左、右孩子都有。
对完全二叉树按从上到下、从左到右的顺序依次编号1,2,…, n ,则有以下关系:
①若 i<=Ln /2」,则结点 i 为分支结点,否则为叶结点,即最后一个分支结点的编号为⌊n/2⌋。②叶结点只可能在层次最大的两层上出现(若删除满二叉树中最底层、最右边的连续2个或以上的叶结点,则倒数第二层将会出现叶结点)。
③若有度为1的结点,则只可能有一个,且该结点只有左孩子而无右孩子(度为1的分支结点只可能是最后一个分支结点,其结点编号为⌊n/2⌋)。
④按层序编号后,一旦出现某结点(如结点 i )为叶结点或只有左孩子的情况,则编号大于 i 的结点均为叶结点(与结论①和结论③是相通的)。
⑤若 n 为奇数,则每个分支结点都有左、右孩子;若 n 为偶数,则编号最大的分支结点
(编号为 n /2)只有左孩子,没有右孩子,其余分支结点都有左、右孩子。
⑥当 i >1时,结点 i 的双亲结点的编号为⌊i/2⌋。
⑦
若结点 i 有左、右孩子,则左孩子编号为2i,右孩子编号为2i+1。
⑧结点 i 所在层次(深度)为⌊logi⌋+1。
5)具有 n 个( n >0)结点的完全二叉树的高度为 ⌈log(n+1)⌉ 或 ⌊logn⌋+1
设高度为 h ,根据性质3和完全二叉树的定义有
2^(h-1)-1< n ≤ 2^h-1 或者 2^(h-1) ≤ n < 2^h
得2^(h-1)< n +1 ≤ 2^h,即 h -1< log( n +1) ≤ h ,因为 h 为正整数,所以 h = ⌈log2( n +1)⌉,或者得 h -1 ≤ logn < h ,所以 h =⌊logn⌋+1。
-
二叉树的遍历:二叉树的遍历是二叉树的一种重要操作,主要有四种遍历方式:前序遍历(根节点-左子树-右子树)、中序遍历(左子树-根节点-右子树)、后序遍历(左子树-右子树-根节点)和层序遍历(从上到下,从左到右)。
-
二叉树的性质:
- 性质1:在二叉树的第i层上至多有2^(i-1)个节点(i≥1)。
- 性质2:深度为k的二叉树至多有2^k - 1个节点(k≥1)。
- 性质3:对于任何一棵二叉树T,如果其终端节点数为n0,度为2的节点数为n2,则n0 = n2 + 1。
二叉树的链式存储:
含有n个结点的二叉链表中 ,空链域为n+1
typedef struct
{ElemType data;struct BiNode *lchile,rchild;
}BiNode,*BiTree;