73. 前序遍历和中序遍历树构造二叉树
根据前序遍历和中序遍历树构造二叉树.
样例
样例 1:
输入:[],[]
输出:{}
解释:
二叉树为空
样例 2:
输入:[2,1,3],[1,2,3]
输出:{2,1,3}
解释:
二叉树如下
2
/ \
1 3
注意事项
你可以假设树中不存在相同数值的节点
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
*@param preorder : A list of integers that preorder traversal of a tree
*@param inorder : A list of integers that inorder traversal of a tree
*@return : Root of a tree
*/
public TreeNode buildTree(int[] preorder, int[] inorder) {
// write your code here
if (inorder == null || inorder.length == 0) {
return null;
}
int n = inorder.length;
return helper(inorder, 0, n - 1, preorder, 0, n - 1);
}
private TreeNode helper(int[] inorder, int start, int end, int[] postorder, int s, int e) {
if (start > end || s > e) {
return null;
}
if (start == end && s == e) {
return new TreeNode(inorder[start]);
}
TreeNode root = new TreeNode(postorder[s]);
int index = start;
for (int i = start; i <= end; i++) {
if (inorder[i] == postorder[s]) {
index = i;
break;
}
}
int lenLeft = index - start;
int lenRight = end - index;
TreeNode left = helper(inorder, start, index - 1, postorder, s+1, s + lenLeft );
TreeNode right = helper(inorder, index + 1, end, postorder, s + lenLeft+1, e);
root.left = left;
root.right = right;
return root;
}
}