PTA 重构二叉树
重构二叉树 (25 分)
给出两个字符串,分别表示二叉树的先序遍历(根、左子树、右子树)和中序遍历(左子树、根、右子树)的结果。
例如,对于下面的二叉树,先序遍历结果是DBACEGF,中序遍历结果是ABCDEFG。
假定二叉树的每个节点都用大写的字母标识,且对于同一棵二叉树,同一个字母不会用两次。现在请你根据给出的先序遍历和中序遍历,重构这棵二叉树。
输入格式:
输入包含一个或多个测试用例。每个测试用例一行,给出两个字符串,表示对二叉树进行先序遍历和中序遍历的结果。这两个字符串都是由大写字母组成(因此它们的长度不超过26)。
输出格式:
将每个测试用例转化为一棵二叉树,并在一行中输出树的后序遍历(左子树、右子树、根)的结果。
输入样例:
DBACEGF ABCDEFG
BCAD CBAD
输出样例:
ACBFGED
CDAB
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> using namespace std; typedef struct node { char data; struct node *lchild,*rchild; }Tree; char a[30],b[30]; Tree *CreatTree(char *a,char *b,int r) //定义返回指针地址的函数 { Tree *T; for(int i=0;i<r;i++) if(a[0]==b[i]) { T=(Tree*)malloc(sizeof(Tree)); //记住要为新定义的指针开辟空间... T->data=a[0]; T->lchild=CreatTree(a+1,b,i); //因为是左子树,所以第一个参数根节点的地址加1就行 //第二个参数的首地址不用变还是原来位置 //第三个参数就要发生改变了,长度就变成了在中序遍历数组中所找到的根节点的位置 T->rchild=CreatTree(a+i+1,b+i+1,r-i-1); //同理,因为是右子树,所以第一个参数根节点还要多加个i //第二个参数同上,首地址位置发生改变 //第三个参数就是当前的长度减去左子树的长度,再加上当前根节点,所以要多减个1 return T; //记住一点要返回指针的地址...切记切记 } return NULL; //当前节点为空的时候返回NULL } void PrintTree(Tree *T) //后序遍历输出此树 { if(!T) return; PrintTree(T->lchild); PrintTree(T->rchild); printf("%c",T->data); } int main() { while(cin>>a>>b) { Tree *T; T=CreatTree(a,b,strlen(b)); //第一个参数是根节点的地址 PrintTree(T); //第二个参数是中序遍历数组的地址 printf("\n"); //第三个参数是中序遍历数组的长度 } return 0; }