Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
For example, given
preorder = [3,9,20,15,7]
inorder = [9,3,15,20,7]
Return the following binary tree:
3
/ \
9 20
/ \
15 7
问题:给一个树的 先序遍历和中序遍历的结果,重建出二叉树;
问题分析:在二叉树的先序遍历中,第一个数字总是树的根节点的值。但是在中序遍历中,根节点的值在序列的中间。左子树在根节点的左边,而又子树位于根节点的右边;根据这个规律我们可以递归生成一个二叉树;代码如下
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
struct TreeNode * ConstructCore(int * startPreorder,int * endPreorder,int * startInorder,int * endInorder);
struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize) {
if(preorderSize == 0 || inorderSize == 0 || preorder == NULL || inorder== NULL)
return NULL;
return ConstructCore(preorder,preorder + preorderSize -1, inorder,inorder + inorderSize -1);
}
struct TreeNode * ConstructCore(int * startPreorder,int * endPreorder,int * startInorder,int * endInorder){
int rootValue = startPreorder[0];
struct TreeNode * root = (struct TreeNode *)malloc(sizeof(struct TreeNode));
root->val = rootValue;
root->left = root->right = NULL;
if(startPreorder == endPreorder){
if(startInorder == endInorder && *startPreorder == *startInorder)
return root;
else
return NULL;
}
int * inorderValue = startInorder;
while(inorderValue<= endInorder && *inorderValue != rootValue)
inorderValue++;
if(inorderValue == endInorder && *inorderValue != rootValue)
return NULL;
int leftLength = inorderValue -startInorder;
int * leftPreorderEnd = leftLength + startPreorder;
if( leftLength > 0 ){
// 左子树
root->left = ConstructCore(startPreorder + 1,leftPreorderEnd,startInorder,inorderValue-1);
}
if(leftLength < endPreorder - startPreorder){
// 右子树
root->right = ConstructCore(leftPreorderEnd+1,endPreorder,inorderValue+1,endInorder);
}
return root;
}