Skip to content

Lec04 Tree

一、基本概念

(1)树的定义:树是一个n个节点的有限集。

  1. 树的根结点没有前驱,除根结点外的所有结点有且只有一个前驱。
  2. 树中所有结点可以有零个或多个后继。
  3. n个节点的树中有n-1条边

(2)基本术语

  1. 度:结点的度为孩子个数;树的度为结点最大度
  2. 深度:结点的深度为从根结点开始向下累加
  3. 高度:结点的高度为从叶结点开始向上累加
  4. 层次:从根结点开始定义,根为第一层;树的深度与高度都为层次的最大值

(3)性质

  1. 树中的结点数等于所有结点的度数加1.
  2. 度为m的树中第i层上至多有\(m^{i-1}\)个结点(i > = 1)

二、二叉树

(1)二叉树的定义:

  1. 每个结点至多只有两棵子树( 即二叉树中不存在度大于2的结点)
  2. 并且二叉树的子树有左右之分,其次序不能任意颠倒

(2)特殊二叉树

  1. 斜树
  2. 满二叉树:高度为h,结点数为\(2^h -1\),除叶节点外的每个结点的度数都为2.
     约定根节点的编号为1,那么,对于一个有双亲的结点i,它的双亲为i/2,若有左孩,为2i,若有右孩,为2i+1.  Alt text
  3. 完全二叉树 Alt text 4. 二叉排序树

(3)二叉树的特殊性质

  1. 非空二叉树上的叶子结点数等于度为2的结点数加1,即\(n_o = n_2 + 1\)
  2. 非空二叉树上第k层上至多有\(2^{k-1}\)个结点。
  3. 高度为h的二叉树至多有\(2^h-1\)个结点。
  4. 对完全二叉树,对每个结点,除了编号的性质,也有层数的性质:编号为i的结点所在的层数为\(log_2 i+1\),那么具有n个结点的完全二叉树的高度为\(log_2 n+1\).

(4)二叉树的储存结构

  1. 顺序储存结构:编号为i的结点存在一维数组下标为i-1的分量中,空的位置用0代替。比较适合 完全二叉树和满二叉树。
  2. 链式储存结构:每一个结点都含有data,left,right。
typedef struct BiTNode{
    TElemType data; //结点数据
    struct BiTNode *lchild, *rchild;    //左右孩子指针
} BiTNode, *BiTree;

三、遍历二叉树

(1)先序遍历

Alt text

(2)中序遍历

Alt text

(3)后序遍历

Alt text

(4)非递归算法

void iter_inorder(Tree T)
{
    stack s;
    while(1)
    {
        for(;T;T=T.left){
            push(T,s);
        }
        T=top(s);
        pop(s);;

        if(T=NULL) break;
        print(T.data);
        T=T.right;
    }   
}

(5)层次遍历:运用队列

1)根结点入队
2)重复:出队,访问出队结点,并将左孩与右孩顺序入队。

(6)由遍历序列构造二叉树

  1. 先序+中序
  2. 后序+中序
  3. 层序+中序

四、线索二叉树

(1)概念与结构

Alt text

(2)二叉树的线索化

实质就是在遍历二叉树的时候修改空指针。也可以通过创造head,让它的lchild指向二叉树的根结点,rchild指向中序遍历访问到的最后一个结点。

五、二叉排序树

(1)性质

  1. 若它的左子树不空,则左子树上所有结点的值均小于它根结点的值。
  2. 若它的右子树不空,则右子树上所有结点的值均大于它根结点的值。
  3. 它的左、右树又分为⼆叉排序树

(2)作用--中序遍历,可以得到排序

(3)查找--对分查找的思想

(4)二叉排序树的删除

  1. 删除叶节点    
  2. 删除的根节点,但仅有一个孩子---互换
  3. 删除的根节点,且有两个孩子---用最左边的最大值/右边的最小值进行替换。

六、树与二叉树的转化

Alt text

七、题目

  1. There exists a binary tree with 2016 nodes in total, and with 16 nodes having only one child.错误
  2. Alt text

  3. Alt text