记录数据结构pta作业
题目
本题目要求用先序序列和中序序列构造一棵二叉树(树中结点个数不超过10个),并输出其后序序列。
输入格式:
在第一行中输入元素个数。
第二行中输入先序序列,用空格分隔。
第三行中输入中序序列,用空格分隔。
输出格式:
输出此二叉树的后序序列,用空格分隔,最后也有一个空格。
输入样例:
5
10 20 30 40 50
20 10 40 30 50
输出样例:
20 40 50 30 10
思路
- 采用递归方式构造二叉树,先序第一个数据,在中序中找到其位置
- 该位置左侧是该数据的左子树,右侧是该数据的右子树
- 起点位置和该数据的差就是左子树的结点数,终点位置和该数据的差就是右子树的结点数
- 然后采用递归的方式不断构造左右子树
代码
#include<iostream>
#include<array>
using namespace std;
typedef struct Node{
int data;
struct Node *lchild,*rchild;
}Node,*pNode;
void creatTree(pNode &root,int* first,int*middle,int start1,int start2,int n){
root = new Node;
root->data = first[start1];
//cout << root->data << endl;
root->lchild = NULL;
root->rchild = NULL;
int rootdata = first[start1];
int i = 0;
for(i = 0;i < n;i++){
if(middle[i+start2]==rootdata)
break;
}
if(start2 + i != start2){
creatTree(root->lchild,first,middle,start1+1,start2,i);
}
if(start2 + i + 1 != start2 + n){
creatTree(root->rchild,first,middle,start1+i+1,start2+i+1,n-i-1);
}
}
void printlatter(pNode tree){
if(tree->lchild){
printlatter(tree->lchild);
}
if(tree->rchild){
printlatter(tree->rchild);
}
cout << tree->data << " ";
}
int main(){
int n;
cin >> n;
pNode tree = NULL;
int* first = new int[n];
int* middle = new int[n];
for(int i = 0;i < n;i++){
cin >> first[i];
}
for(int i = 0;i < n;i++){
cin >> middle[i];
}
int start = 0;
creatTree(tree,first,middle,start,start,n);
printlatter(tree);
system("pause");
return 0;
}