二叉树的常见操作

时间:2021-08-22 14:40:26

【输出二叉树中的叶子结点】

无论前序、中序、后序遍历,叶子结点的输出顺序都是一样的吗??都是一样的,输出顺序为:从树的左边到右边叶子!!在二叉树的遍历算法中增加检测结点的“左右子树是否都为空”。

 1 void PreOrderPrintLeaves(BinTree Bt)
 2 {
 3     if(Bt)
 4     {
 5         if(Bt->Left == NULL && Bt->Right == NULL)
 6             printf("%c ", Bt->Data);
 7         PreOrderPrintLeaves(Bt->Left);
 8         PreOrderPrintLeaves(Bt->Right);
 9     }
10 }
11 
12 void InOrderPrintLeaves(BinTree Bt)
13 {
14     if(Bt)
15     {
16         InOrderPrintLeaves(Bt->Left);
17         if(Bt->Left == NULL && Bt->Right == NULL)
18             printf("%c ", Bt->Data);
19         InOrderPrintLeaves(Bt->Right);
20     }
21 }
22 
23 void PostOrderPrintLeaves(BinTree Bt)
24 {
25     if(Bt)
26     {
27         PostOrderPrintLeaves(Bt->Left);
28         PostOrderPrintLeaves(Bt->Right);
29         if(Bt->Left == NULL && Bt->Right == NULL)
30             printf("%c ", Bt->Data);
31     }
32 }

【求二叉树的叶子结点数】

1 int BinTreeGetLeaves(BinTree Bt)
2 {
3     if(Bt == NULL)
4         return 0;
5     if(Bt->Left == NULL && Bt->Right == NULL)
6         return 1;
7     else
8         return BinTreeGetLeaves(Bt->Left) + BinTreeGetLeaves(Bt->Right);
9 }

 

【求二叉树的高度】

 二叉树的常见操作

 1 int PostOrderGetHeight(BinTree Bt)
 2 {
 3     int HL, HR, MaxH;
 4 
 5     if(Bt)
 6     {
 7         HL = PostOrderGetHeight(Bt->Left);
 8         HR = PostOrderGetHeight(Bt->Right);
 9         MaxH = (HL > HR) ? HL : HR;
10         return (MaxH + 1);
11     }
12     else
13     {
14         return 0;
15     }
16 }

 

【由两种遍历序列确定二叉树】

 已知三种遍历中的任意两种遍历序列,能否唯一确定一棵二叉树呢??必须要有中序遍历才行!!

1、先序和中序遍历序列来确定一棵二叉树??

  • 根据先序遍历序列第一个结点确定根结点
  • 根据根结点中序遍历序列中分割左右两个子序列
  • 左子树右子树分别递归使用相同的方式继续分解;

2、后序和中序遍历序列来确定一棵二叉树??

  • 根据后序遍历序列最后一个结点确定根结点
  • 根据根结点中序遍历序列中分割左右两个子序列
  • 左子树右子树分别递归使用相同的方式继续分解;