根据中序遍历和后序遍历构建二叉树
同根据前序遍历和中序遍历构建二叉树 先确定二叉树
找根结点: 后序的最后一个为根结点1 在中序中找到1 中序中 1前面的对应根结点1的左子树 一共三个结点
在后序中前三个结点4 5 2 为1的左子树后序遍历结果 确定 2 为1的左儿子
同理中序中 6 3 8 7 为1的右子树的前序遍历结果
后序中6 8 7 3 为1的右子树的后序遍历结果
Node* BuildTreeInPos(DataType Inorder[], DataType Posorder[], int size)//中序+后序
{
if (size == 0)
return NULL;
int r = -1;
for (int i = 0; i < size; i++)
{
if (Inorder[i] == Posorder[size - 1])
{
r = i;
break;
}
}
assert(r != -1);
Node*root = (Node*)malloc(sizeof(Node));
root->value = Posorder[size - 1];//与前+中不同
root->left = BuildTreeInPos(Inorder, Posorder, r);
root->right = BuildTreeInPos(Inorder + r + 1, Posorder + r , size - 1 - r);
//注意这里的posorder加的是r 不是r+1!!!!!!!!!!!!!!!!!!!!
return root;
}