Construct Binary Tree from Inorder and Postorder Traversal
Leetcode
Given inorder and postorder traversal of a tree, construct the binary tree.
Analysis
- post-order的最后一个作为root
- 从in-order中找到root,左边range是left tree,右边range是right tree
- post-order根据这两个range可以recursive的建立subtree
Code
public TreeNode buildTreePostIn(int[] inorder, int[] postorder) {
if (inorder == null || postorder == null || inorder.length != postorder.length)
return null;
HashMap<Integer, Integer> hm = new HashMap<Integer,Integer>();
for (int i=0;i<inorder.length;++i)
hm.put(inorder[i], i);
return buildTreePostIn(inorder, 0, inorder.length-1, postorder, 0,
postorder.length-1,hm);
}
private TreeNode buildTreePostIn(int[] inorder, int is, int ie, int[] postorder, int ps, int pe,
HashMap<Integer,Integer> hm){
if (ps>pe || is>ie) return null;
TreeNode root = new TreeNode(postorder[pe]);
int ri = hm.get(postorder[pe]);
TreeNode leftchild = buildTreePostIn(inorder, is, ri-1, postorder, ps, ps+ri-is-1, hm);
TreeNode rightchild = buildTreePostIn(inorder,ri+1, ie, postorder, ps+ri-is, pe-1, hm);
root.left = leftchild;
root.right = rightchild;
return root;
}
Notes
- 用hashmap存inorder,因为要反复的从inorder中找root值的index。所以hashmap的key是inorder的value,value是inorder的index。
- 这题的难点在于left和right tree的index的选择需要很小心,特别是postorder的index。
- Left tree: 在inorder里找到root的index ri以后,通过ri-is得到left tree的长度。postorder里取前ri-is个构成left tree。
- inorder: is -> ri-1
- postorder: ps -> ps+ri-is-1
- Right tree:
- inorder: ri+1 -> ie
- postorder: ps+ri-is -> pe-1
Reference
Leetcode