Problem Description:
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
Analysis:
本题的思路就是对两个数组进行裁剪,利用先序遍历形成的数组和中序遍历的数组的规律对两个数组进行分割,先序数组的第一个元素是每棵子树的根节点,对应的在中序遍历序列中其元素的左边元素都是其左子树的元素,其右边都是其右子树的元素。代码如下:
Code:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int[] preorder;
int[] inorder;
public TreeNode buildTree(int[] preorder, int[] inorder) {
this.preorder = preorder;
this.inorder = inorder;
return helper(0, 0, inorder.length - 1);
}
public TreeNode helper(int preStart, int inStart, int inEnd) {
if(inStart > inEnd || preStart >= preorder.length)
return null;
int cur = preorder[preStart];
int cur_index = 0;
for(int i = inStart; i <=inEnd; i++) {
if(inorder[i] == cur) {
cur_index = i;
break;
}
}
TreeNode res = new TreeNode(cur);
res.left = helper(preStart + 1, inStart, cur_index - 1);
res.right = helper(preStart + cur_index - inStart + 1, cur_index + 1, inEnd);
return res;
}
}