2020.11.14天梯赛练习*6
7-9 树的遍历 (25分)
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(≤),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树的层序遍历的序列。数字间以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<cstdio> #include<cstdlib> #include<cmath> using namespace std; #define MAXSIZE 31 struct Tnode{ int data; Tnode *left; Tnode *right; }; Tnode *PutBinTree(int a[],int b[],int k){ /*b为存放后序遍历的数组,b为存放中序遍历的数组,k代表当前结点的左右子树结点的个数和*/ int i,t; if(k==0){ return NULL; } Tnode *BT=(Tnode *)malloc(sizeof(Tnode)); t=a[k-1]; //t取后序的最后一个结点 BT->data=t; //存放根结点 for(i=0;i<k;i++){ if(b[i]==t){ break; } } BT->left= PutBinTree(a, b, i); BT->right= PutBinTree(a+i, b+i+1, k-i-1); return BT; } void putBinTree(Tnode *BT) { Tnode *s[MAXSIZE]; int t=0,k=1; s[t]=BT; while(t!=k){ if(!t){ cout<<s[t]->data; //第一个数字不加空格 }else{ cout<<" "<<s[t]->data; } if(s[t]->left) { s[k]=s[t]->left; k=(k+1)%MAXSIZE; } if(s[t]->right) { s[k]=s[t]->right; k=(k+1)%MAXSIZE; } t=(t+1)%MAXSIZE; } } int main(){ int i, n; int a[MAXSIZE],b[MAXSIZE]; cin>>n; for(i=0;i<n;i++){ cin>>a[i]; } for(i=0;i<n;i++){ cin>>b[i]; } Tnode *BT=PutBinTree(a,b,n); putBinTree(BT); return 0; }

浙公网安备 33010602011771号