数据结构的作业题,题目用了一种奇怪的表述,但他的本质就是根据前序遍历和中序遍历重建二叉树再进行后序遍历。博主百思不得其解,百了一度才明白做法,现记之。
Tree reBuildTree (ElementType preOrder[],ElementType inOrder[],int n)
{
if(n<=0) return NULL; //如果没有元素,返回空指针;
Tree root = (Tree)malloc(sizeof(struct TreeNode));
root->Element=preOrder[0];//前序遍历的第一个元素就是根节点的值
int i;
for(i=0;i<n;i++)
{
// 在中序遍历中寻找根节点的位置
if(inOrder[i]==preOrder[0]) break;
}
//在中序遍历中i左边的元素是左子树中序遍历的结果
//同理i右边的是右子树中序遍历的结果
//在前序遍历中根节点(preOrder[0])之后的i个元素属于左子树的遍历结果
//接下来只需要递归调用重建左右子树即可
root->Left=reBuildTree(preOrder+1,inOrder,i);
root->Right=reBuildTree(preOrder+1+i,inOrder+i+1,n-i-1);
return root;
}