重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,重建出该二叉树。
例如:前序遍历:1 2 4 7 3 5 6 8
中序遍历:4 7 2 1 5 3 8 6
分析:前序遍历的第一个值为根节点的值,然后跟的是左子树和右子树中所有的节点
中序遍历中前一部分是左子树节点,中间是根节点,后面一部分是右子树节点。
如例题中给出的遍历结果,第一次可以划定:
前序遍历:1 2 4 7 3 5 6 8 中序遍历:4 7 2 1 5 3 8 6
根 左 右 左 根 右
第二次划分:
前序遍历:1 2 4 7 3 5 6 8 中序遍历:4 7 2 1 5 3 8 6
根 左根左右 左 根 左根右
第三次划分:
前序遍历:1 2 4 7 3 5 6 8 中序遍历:4 7 2 1 5 3 8 6
根右 根左 根右 左根
由此可以看出,这是一个递归的过程。具体程序如下:
void CreateTree(Node *root, int bstart, int bend,int mstart, int mend, int *before, int *mid, int len)
{
if (root == NULL)
return;
if ( bstart > bend )
return;
if ( mstart > mend )
return;
//前序遍历的第一个值为根节点的值
root->value = before[bstart];
//在中序遍历中找出该值所在的位置
int temp; //记下该值的位置
int count =0; //记下该左子树中有多少个节点
for ( int i=mstart; i<= mend; i++)
{
if ( mid[i] == root->value )
{
temp = i;
break;
}
count++;
}
//进行递归,建立左子树和右子树,注意子树为空的情况
if ( count == 0 )
root->left = NULL;
else
{
Node *left = new Node;
root->left = left;
CreateTree(left, bstart+1, bstart+count, mstart, temp-1, before, mid, len);
}
if ( temp == mend)
root->right = NULL;
else
{
Node *right = new Node;
root->right = right;
CreateTree(right, bstart+count+1,bend,temp+1,mend,before, mid, len);
}
}