105. Construct Binary Tree from Preorder and Inorder Traversal
106. Construct Binary Tree from Inorder and Postorder Traversal
Note:
You may assume that duplicates do not exist in the tree.
将手动解法规则化,主要是找到左右子树的起始位置,还是蛮简单的,注意边界。
105
public class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if(preorder.length==0) return null;
return build(preorder, inorder, 0, preorder.length-1, 0, inorder.length);
}
public TreeNode build(int[] preorder, int[] inorder, int p_s, int p_e, int i_s, int i_e){
if(p_s>p_e||i_s > i_e) return null;
TreeNode root = new TreeNode(preorder[p_s]);
int i = -1;
for(i = i_s; i<= i_e; i++){
if(preorder[p_s]==inorder[i]) break;
}
root.left = build(preorder, inorder, p_s+1, p_s+i-i_s, i_s, i-1);
root.right = build(preorder, inorder, p_s+i-i_s+1, p_e, i+1, i_e);
return root;
}
}
106
public class Solution {
public TreeNode buildTree(int[] inorder, int[] postorder) {
if(inorder.length==0) return null;
return build(inorder, postorder, 0, inorder.length-1, 0, postorder.length-1);
}
public TreeNode build(int[] inorder, int[] postorder, int i_s, int i_end, int p_s, int p_end){
if(i_s > i_end) return null;
TreeNode root = new TreeNode(postorder[p_end]);
int i = 0;
for(i=i_s; i<= i_end; i++){
if(inorder[i]==postorder[p_end])
break;
}
root.left = build(inorder, postorder, i_s, i-1, p_s, p_s + i-i_s-1);
root.right = build(inorder, postorder, i+1, i_end, p_s+i-i_s, p_end-1);
return root;
}
}