由前序遍历和中序遍历重建二叉树(前序序列:1 2 3 4 5 6 - 中序序列:3 2 4 1 6 5)
思路:
前序遍历第一个是根节点。
中序遍历根节点左侧为左子树,根右侧为右子树。
那么先构造根节点,根节点左侧都为左子树,根右侧都为右子树。
然后对左右子树递归式的构造即可。
//封装
BinaryTreeNode* Construct(int * preorder, int* inorder,int length)
{
if(preorder == NULL || inorder == NULL || length <= 0)
return NULL;
return ConstructCore(perorder, preorder+length-1,inorder,inorder+length-1);
}
//找根并递归构建
BinaryTreeNode* ConstructCore(int* startPreorder,int* endPreorder,int* startInorder,int* endInorder)
{
int rootValue = startPreorder[0];
BinaryTreeNode* Root = new BinaryTreeNode();
Root -> value = rootvalue;
Root -> left = Root -> right = NULL;
if(startPreorder == endPreorder)
{
if(startInorder == endInorder && *startPreorder = *startInorder)
return Root;
else
cout<<"error input"<<endl;
return NULL;
}
//中序遍历找根
int *rootInorder = startInorder;
while(rootInorder <= endInorder && *rootInorder != rootValue)
++rootInorder;
if(rootInorder > endInorder)
return NULL;
int leftLength = rootInorder - startInorder;
int * leftPreOrderEnd = startPreorder+leftLength;
//递归构建左右子树
if(leftLength > 0)
Root -> left = ConstructCore(startPreorder+1,leftPreOrderEnd,startInorder,rootInorder-1);
if(leftLength < endPreorder - startPreorder)
Root -> right = ConstructCore(leftPreOrderEnd+1,endPreorder,rootInorder+1,endInorder-1);
return Root;
}