题目链接:https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/
题目:
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 基本相同。
不同点在于:
- 后序遍历中根的顺序是从后往前的。因此遍历后序数组时,应当从后往前搜索。
- 后序遍历时先经过右子树的根再经过左子树的根。因此,递归时先递归遍历右子树,再递归遍历左子树。最后把得到的两个子树接到当前的根结点上。
此次和大神思路相同,代码实现稍有不同,附上参考链接:
http://blog.csdn.net/linhuanmars/article/details/24390157?utm_source=tuicool
代码实现:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public 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 root;
}
}
202 / 202 test cases passed.
Status: Accepted
Runtime: 5 ms