欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

数据结构(树的遍历)

程序员文章站 2022-05-01 19:16:07
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。输入格式:输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。输出格式:在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。输入样例:72 3 1 5 7 6 41 2 3 4 5 6 7输出样例:4 1 6 3 5 7 2分析:无论是给定中序遍历、后序遍历,还是中序遍历、前序遍历...

给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

输入格式:
输入第一行给出一个正整数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

分析:无论是给定中序遍历、后序遍历,还是中序遍历、前序遍历,都要首先确定根结点,而确定一定不是通过中序遍历,因为它是左根右,无法直接确定哪一个是所有树的根结点。然后递归调用即可。
#include <iostream> #include <queue> #include <cstdlib> using namespace std; typedef struct Node{ int data; struct Node *left,*right; }Node,*Tree; Tree create(int n,int *aft,int *mid){ if(n==0) return NULL; Tree tree = (Node *)malloc(sizeof(Node)); tree->data = aft[n-1]; tree->left = tree->right = NULL; int i; for(i = 0;i<n;i++){ if(mid[i]==aft[n-1]) break; } tree->left = create(i,aft,mid);//左子树 tree->right = create(n-1-i,aft+i,mid+i+1);//右子树  return tree; } void order(int n,Tree tree){ if(!tree) return; queue<Tree> qe; qe.push(tree); int len = 0; while(!qe.empty()){ Tree t = qe.front(); len++; if(len<n) cout << t->data << " "; else cout << t->data; if(t->left) qe.push(t->left); if(t->right) qe.push(t->right); qe.pop(); } } int main(){ ios::sync_with_stdio(false); int n; cin >> n; int aft[n],mid[n]; int num; for(int i = 0;i<n;i++){ cin >> aft[i]; } for(int i = 0;i<n;i++){ cin >> mid[i]; } Tree tree = create(n,aft,mid); order(n,tree); return 0; } 

本文地址:https://blog.csdn.net/weixin_45845039/article/details/107763284