Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
For example, given
inorder = [9,3,15,20,7]
postorder = [9,15,7,20,3]
Return the following binary tree:
3
/ \
9 20
/ \
15 7
思路:
inorder: left, current, right;
postorder, left, right, current;
postorder最后一个是current, 然后在inorder中搜索current index,然后左边的是left,右边的是right。算出左边的size之后,计算postorder的left,right index;
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode buildTree(int[] inorder, int[] postorder) {
if(inorder == null || postorder == null) {
return null;
}
int n = inorder.length;
return build(inorder, 0, n - 1, postorder, 0, n - 1);
}
private TreeNode build(int[] inorder, int istart, int iend,
int[] postorder, int pstart, int pend) {
if(istart > iend || pstart > pend) {
return null;
}
if(istart == iend) {
return new TreeNode(inorder[istart]);
}
TreeNode root = new TreeNode(postorder[pend]);
int i = istart;
for(; i <= iend; i++) {
if(inorder[i] == root.val) {
break;
}
}
int leftlen = i - istart;
root.left = build(inorder, istart, i - 1, postorder, pstart, pstart + leftlen - 1);
root.right = build(inorder, i + 1, iend, postorder, pstart + leftlen, pend - 1);
return root;
}
}