320二叉树的不同形态(已知层次遍历和中序遍历创建二叉树;输出叶子结点(从左到右);后序遍历)

发布时间 2023-12-23 13:00:07作者: xzdmzrc

题目: 二叉树的不同形态

问题描述

给定二叉树T(树深度H<=10,深度从1开始,结点个数N<1024,结点编号1~N)的层次遍历序列和中序遍历序列,输出T从左向右叶子结点以及二叉树先序和后序遍历序列。

输入格式

输入共三行:第一行是整数n,表示二叉树中的结点数目;第二行有n个整数,表示该二叉树的层次遍历序列;第三行也是n个整数,表示该二叉树的中序遍历序列。整数间以空格隔开。

输出格式

输出三行,分别是:从左向右的叶子结点,先序遍历序列,后序遍历序列。结点编号用空格隔开。

样例输入

    7

3 5 4 2 6 7 1

2 5 3 6 4 7 1

样例输出

2 6 1

3 5 2 4 6 7 1

2 5 6 1 7 4 3


1、已知层次遍历和中序遍历创建二叉树

 1 tree createTree(int *level,int *in,int begin1, int end1,int begin2,int end2)
 2 {
 3     if(begin2>end2) return NULL;
 4     else
 5     {
 6             treenode *t;
 7             t=(treenode*)malloc(sizeof(treenode));
 8     
 9     int i,j;
10     int flag=0;
11     for(i=begin1;i<=end1;i++)
12     {
13         for(j=begin2;j<=end2;j++)
14         {
15             if(level[i]==in[j]) 
16             {
17                 flag=1; break;
18             }
19         }
20         if(flag==1) break;
21     }
22     
23     t->data=level[i];
24     t->lchild=createTree(level,in,begin1+1,end1,begin2,j-1);
25     t->rchild=createTree(level,in,begin1+1,end1,j+1,end2);
26     return t;
27     
28     
29     }
30 
31 }

 

*********对比:已知先序和中序的create***************

 1 tree createTree(char *pre,char *in,int n)
 2 {
 3     int k;
 4     char *p;
 5     //if(n<=0) return NULL;
 6     
 7     treenode *b=(treenode*)malloc(sizeof(treenode));
 8     b->data=*pre;
 9     for(p=in;p<in+n;p++)
10     {
11         if(*p==*pre) break;
12     }
13     
14     k=p-in;
15     b->lchild=createTree(pre+1,in,k);
16     b->rchild=createTree(pre+k+1,p+1,n-k-1);
17     return b;
18     
19 }

2、输出叶子结点:

 1 void printleaf(tree t)
 2 {
 3     if(t==NULL)
 4     {
 5         return;
 6     }
 7     else
 8     {
 9         if(!t->lchild&&!t->rchild)
10         {
11             printf("%d ",t->data);
12         }
13         printleaf(t->lchild);
14         printleaf(t->rchild);
15     }
16 }//from CSDN
17 
18 
19 
20 /*void printleaf(tree t)
21 {
22     if(!t->lchild&&!t->rchild)
23     {
24         printf("%d ",t->data);
25     }
26     else//多余的else
27     {
28         printleaf(t->lchild);
29         printleaf(t->rchild);
30     }
31 }//MINE*/

纠错:

20 void printleaf(tree t)
21 {
22     if(!t->lchild&&!t->rchild)
23     {
24         printf("%d ",t->data);
25     }
26     
27    
28         printleaf(t->lchild);
29         printleaf(t->rchild);
30
31 }

3、后序遍历,略

4、整合:


  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 typedef struct treenode
  4 {
  5     int data;
  6     struct treenode *lchild;
  7     struct treenode *rchild;
  8 }treenode,*tree;
  9 tree createTree(int *level,int *in,int left1,int right1,int left2,int right2 );
 10 //core
 11 void printleaf(tree t);
 12 void preorder(tree t);
 13 void postorder(tree t);
 14 
 15 
 16 int main()
 17 {
 18     int n;//the number of vertex
 19     scanf("%d",&n);
 20     
 21     int level[n],in[n];
 22     int i,j;
 23     
 24     for(i=0;i<n;i++)
 25     {
 26         scanf("%d",&level[i]);
 27     }
 28     for(j=0;j<n;j++)
 29     {
 30         scanf("%d",&in[j]);
 31     }//input
 32     
 33     tree t=NULL;
 34     int begin1=0,begin2=0;
 35     int end1=n-1,end2=n-1;
 36     t=createTree(level,in,begin1,end1,begin2,end2);
 37     printleaf(t);
 38     printf("\n");
 39     preorder(t);
 40     printf("\n");
 41     postorder(t);
 42 }
 43 tree createTree(int *level,int *in,int begin1, int end1,int begin2,int end2)
 44 {
 45     if(begin2>end2) return NULL;
 46     else
 47     {
 48             treenode *t;
 49             t=(treenode*)malloc(sizeof(treenode));
 50     
 51     int i,j;
 52     int flag=0;
 53     for(i=begin1;i<=end1;i++)
 54     {
 55         for(j=begin2;j<=end2;j++)
 56         {
 57             if(level[i]==in[j]) 
 58             {
 59                 flag=1; break;
 60             }
 61         }
 62         if(flag==1) break;
 63     }
 64     
 65     t->data=level[i];
 66     t->lchild=createTree(level,in,begin1+1,end1,begin2,j-1);
 67     t->rchild=createTree(level,in,begin1+1,end1,j+1,end2);
 68     return t;
 69     
 70     
 71     }
 72 
 73 }
 74 
 75 void printleaf(tree t)
 76 {
 77     if(!t->lchild&&!t->rchild)
 78     {
 79         printf("%d ",t->data);
 80     }
 81         printleaf(t->lchild);
 82         printleaf(t->rchild);
 83     
 84 }
 85 
 86 void preorder(tree t)
 87 {
 88     if(t)
 89     {
 90         printf("%d ",t->data);
 91         preorder(t->lchild);
 92         preorder(t->rchild);
 93     }
 94 }
 95 void postorder(tree t)
 96 {
 97     if(t)
 98     {
 99         postorder(t->lchild);
100         postorder(t->rchild);
101         printf("%d ",t->data);
102     }
103 }