二叉树的常见操作

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

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

 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、先序和中序遍历序列来确定一棵二叉树??

  • 根据先序遍历序列第一个结点确定根结点
  • 根据根结点中序遍历序列中分割左右两个子序列
  • 左子树右子树分别递归使用相同的方式继续分解;
 1 struct node
 2 {
 3     char data;
 4     struct node *lt, *rt;
 5 };
 6 
 7 // 用先序序列和中序序列建立二叉树
 8 struct node *create_by_pre_and_mid(int n, char *pre, char *mid)
 9 {
10     struct node *root;
11     int i;
12 
13     if(n==0)
14         return NULL;
15 
16     root=(struct node *)malloc(sizeof(struct node));
17     root->data=pre[0];
18 
19     for(i=0;i<n;i++) // 寻找左右子树的元素
20         if(pre[0]==mid[i])
21             break;
22 
23     root->lt = create_by_pre_and_mid(i, pre+1, mid); // 建立左子树
24     root->rt = create_by_pre_and_mid(n-i-1, pre+i+1, mid+i+1); // 建立右子树
25 
26     return root;
27 }

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

  • 根据后序遍历序列最后一个结点确定根结点
  • 根据根结点中序遍历序列中分割左右两个子序列
  • 左子树右子树分别递归使用相同的方式继续分解;
 1 // 用后序序列和中序序列建立二叉树
 2 struct node *create_by_post_and_mid(int n, char *post, char *mid)
 3 {
 4     struct node *root;
 5     int i;
 6 
 7     if(n==0)
 8         return NULL;
 9 
10     root=(struct node *)malloc(sizeof(struct node));
11     root->data=post[n-1];
12 
13     for(i=0;i<n;i++) // 寻找左右子树的元素
14         if(post[n-1]==mid[i])
15             break;
16 
17     root->lt = create_by_post_and_mid(i, post, mid); // 建立左子树
18     root->rt = create_by_post_and_mid(n-i-1, post+i, mid+i+1); // 建立右子树
19 
20     return root;
21 }
原文地址:https://www.cnblogs.com/utank/p/4272409.html