Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
题意:给定一棵树的前序遍历和中序遍历,还原二叉树
解决思路:我们可以知道的是,前序遍历的第一个结点就是根节点,而且对于中序遍历,每一个根节点的左边是其左子树,右边是其右子树。也就是说,我们通过从头到尾遍历前序遍历的结点,就可以不断得到左子树的根,然后通过中序遍历划出左子树。同样的,右子树也可以这样还原出来。
而且有一点小细节:刚刚提到的根节点在前序遍历结果中的位置一定在中序遍历的前面
代码:
public class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
return helper(0, 0, inorder.length - 1, preorder, inorder);
}
private TreeNode helper(int preStart, int inStart, int inEnd, int[] preorder, int[] inorder){
if(preStart > preorder.length - 1 || inStart > inEnd){
return null;
}
int index = 0;
TreeNode root = new TreeNode(preorder[preStart]);
for(int i = inStart; i <= inEnd; i++){
if(inorder[i] == root.val){
index = i;
break;
}
}
root.left = helper(preStart + 1, inStart, index - 1, preorder, inorder);
root.right = helper(preStart + index - inStart + 1, index + 1, inEnd, preorder, inorder);
return root;
}
}