数据结构题,必须知道中序才能确定树,然后递归就行了。模拟过程如下;
先序:1 2 4 7 3 5 6 8 中序:4 7 2 1 5 3 8 6先序为1,即根为1,到中序中找到1的位置,然后1左边的为左子树,右边的为右子树
分为2部分:
先序:2 4 7 中序 :7 2 4
先序:3 5 6 8 中序:5 3 8 6
重复前面的步骤,构建树。
而打印树的过程,把根的输出放在递归前为先序,放在中间位中序,放最后为后序,想想是不是酱紫的!!!
#include<cstdio>
#include<cstring>
struct node
{
int val;
node *left,*right;
node(int val)
{
this->val = val;
this->left = this->right = NULL;
}
};
bool isTree;
int n;
node *reBuiltTree(int *preTree ,int *inTree ,int n)
{
if(n <= 0)
{
return NULL;
}
if(n == 1)
{
if(preTree[0] != inTree[0])
{
isTree = 0;
return NULL;
}
return new node(preTree[0]);
}
int i;
for(i=0;i<n && preTree[0] != inTree[i];++i)
{
}
if(i == n)
{
isTree = 0;
return NULL;
}
node *root = new node(preTree[0]);
root->left = reBuiltTree(preTree+1,inTree,i);
root->right = reBuiltTree(preTree+1+i,inTree+i+1,n-i-1);
return root;
}
void printTree(node *tree)
{
if(tree)
{
printTree(tree->left);
printTree(tree->right);
printf("%d ",tree->val);
}
}
int main()
{
while(scanf("%d",&n) != EOF)
{
int preTree[1111],inTree[1111];
isTree = 1;
node *tree;
for(int i=0;i<n;++i)
{
scanf("%d",&preTree[i]);
}
for(int i=0;i<n;++i)
{
scanf("%d",&inTree[i]);
}
tree = reBuiltTree(preTree,inTree,n);
if(isTree == 0)
{
printf("No");
}
else
printTree(tree);
printf("\n");
}
return 0;
}