其实和通过前序和中序遍历数组重建树 类似。区别是先从前序数组中找到根节点的下一个元素在后续数组中的位置,判断该元素的下一个节点是不是根节点,如果不是,则说明该元素是根节点的左孩子,因为在后续数组中该元素和根节点有其他节点,即右子树。我们可以用同样的方法先创建左子树,在创建右子树。然后按照顺序递归,即可重建二叉树。
void CreateTreeByPreAndPost(Node* node, char * pre, char * post, int size)
{
if(NULL ==node)
{
return;
}
if(1 == size )
{
node->value = pre[0];
return;
}
node->value = *pre;
int subSize = 0;
while( pre[1] != post[subSize])
{
++subSize;
}
if(subSize != size -2)
{
Node* child = new Node;
node->Left = child;
CreateTreeByPreAndMid(child, pre+1,post, subSize + 1);
}
if(++subSize < size)
{
Node* child = new Node;
node->Right = child;
CreateTreeByPreAndMid(child, pre+subSize + 1,post + subSize, size - subSize - 1);
}
}