/*
题目:
输入二叉树的前序遍历和中序遍历的结果,重建二叉树。假设输入的前序遍历和中序遍历的结果中不包含重复的数字。
*/
/*
思路:
使用前序遍历找到根节点,再通过中序遍历找到左子树和右子树。
采用递归的方法建立。
*/
struct BinaryTreeNode{
int value;
BinaryTreeNode* left;
BinaryTreeNode* right
}
BinaryTreeNode* Construct(int* preOrder,int* Inorder,int length){
if(preOrder == null || Inorder == null || length <= 0){
return null;
}
return ConstructCore(preOrder,preOrder+length-1,Inorder,Inorder+length-1);
}
BinaryTreeNode* ConstructCore(int *preOrder,int* endPreOrder,int* inOrder,int *endInOrder){
BinaryTreeNode* root = new BinaryTreeNode();
root->value = *preOrder;
root->left = null;
root->right = null;
if(preOrder == endInOrder){
if(inOrder == endInOrder && preOrder == inOrder){
return root;
}
else{
throw std::exception("Invalid input");
}
}
//在中序遍历中找到根节点
int* rootInorder = inOrder;
while(rootInorder <= endInOrder && *rootInorder != root->value){
rootInorder++;
}
int leftLength = rootInorder - inOrder;
int *leftPreOrderEnd = preOrder + leftLength;
//创建左子树
if(leftLength > 0){
root->left = ConstructCore(preOrder+1,leftPreOrderEnd,inOrder,rootInorder-1);
}
if(leftLength < endPreOrder - preOrder){
root->right = ConstructCore(leftPreOrderEnd+1,endPreOrder,rootInorder+1,endInOrder);
}
return root;
}