7-4 树的遍历 (20 分)
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7 2 3 1 5 7 6 4 1 2 3 4 5 6 7
结尾无空行
输出样例:
4 1 6 3 5 7 2
结尾无空行
思路:
1.首先肯定是得会后序遍历和中序遍历还原二叉树
(前面的递归还原二叉树,找张纸跟着代码递归几次画一画,就懂了)
struct node *create(int pos[], int pre[], int n) { int i = 0, k = 0, root = 0; if (n == 0) return NULL; //判断空 struct node *T; T = (struct node *)malloc(sizeof(struct node)); if (T == NULL)//分配结点内存及判断是否成功 return NULL; root = pos[n - 1];//后序遍历最后一位是根节点 T->num = root; for (i = 0; i<n; i++){ if (pre[i] == root){ //中序遍历 k = i; //记录下标,用来递归 break; } } T->left = create(pos, pre, k);//递归左子树 T->right = create(pos + k, pre + k + 1, n - k - 1); //递归右子树 return T; }
2.其次就是通过队列层次遍历
void quene(node *T) { struct node *p[33], *q; int f = 0, r = 0; int num = 0; if (T) { p[r++] = T; //循环来完成层次遍历 //f完成输出该层,r构造下一层 while (f != r) { q = p[f++]; printf("%d", q->num); num++; if (num < m) printf(" "); if (q->left) p[r++] = q->left; if (q->right) p[r++] = q->right; } } }
代码
#include<stdio.h> #include<malloc.h> int m = 0; int Pre[33] = {0};//中序 int Post[33] = {0};//后序 typedef struct node { int num; struct node* left; struct node* right; }node; struct node *create(int pos[], int pre[], int n); void sequence(node *T); int main(void) { node *T = NULL; scanf("%d", &m); int i = 0; for (i = 0; i < m; i++) scanf("%d", &Post[i]); for (i = 0; i < m; i++) scanf("%d", &Pre[i]); T = create(Post, Pre, m); quene(T); return 0; } void quene(node *T) { struct node *p[33], *q; int f = 0, r = 0; int num = 0; if (T) { p[r++] = T; while (f != r) { q = p[f++]; printf("%d", q->num); num++; if (num < m) printf(" "); if (q->left) p[r++] = q->left; if (q->right) p[r++] = q->right; } } } struct node *create(int pos[], int pre[], int n) { int i = 0, k = 0, root = 0; if (n == 0) return NULL; struct node *T; T = (struct node *)malloc(sizeof(struct node)); if (T == NULL) return NULL; root = pos[n - 1]; T->num = root; for (i = 0; i<n; i++){ if (pre[i] == root){ k = i; break; } } T->left = create(pos, pre, k); T->right = create(pos + k, pre + k + 1, n - k - 1); return T; }
这篇博客介绍了如何根据后序遍历和中序遍历序列还原二叉树,并给出了层次遍历的代码实现。首先,通过递归方式创建二叉树结构,然后使用队列进行层次遍历输出。示例代码展示了整个过程。
2033

被折叠的 条评论
为什么被折叠?



