Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
思路:
这题的思路与 105 Construct Binary Tree from Preorder and Inorder Traversal 基本相同。
不同点在于:
后序遍历中根的顺序是从后往前的。因此遍历后序数组时,应当从后往前搜索。
后序遍历时先经过右子树的根再经过左子树的根。因此,递归时先递归遍历右子树,再递归遍历左子树。最后把得到的两个子树接到当前的根结点上。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode buildTree(int[] inorder, int[] postorder) {
if(inorder == null || inorder.length == 0 || postorder == null || postorder.length == 0 || inorder.length != postorder.length)
return null;
HashMap<Integer, Integer> map = new HashMap();
for(int i = 0; i < inorder.length; i ++)
map.put(inorder[i], i);
return helper(inorder, 0, inorder.length - 1, postorder, postorder.length - 1, map);
}
TreeNode helper(int[] inorder, int startIn, int endIn, int[] postorder, int endPost, HashMap<Integer, Integer> map) {
if(startIn > endIn)
return null;
TreeNode root = new TreeNode(postorder[endPost]);
int index = map.get(root.val);
root.right = helper(inorder, index + 1, endIn, postorder, endPost - 1, map);
root.left = helper(inorder, startIn, index - 1, postorder, endPost - (endIn - index + 1), map);
return