Fair Construct Binary Tree from Inorder and Postorder TraversalMy Submissions
37%
Accepted
Given inorder and postorder traversal of a tree, construct the binary tree.
Note
You may assume that duplicates do not exist in the tree.
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
*@param inorder : A list of integers that inorder traversal of a tree
*@param postorder : A list of integers that postorder traversal of a tree
*@return : Root of a tree
*/
public TreeNode buildTree(int[] inorder, int[] postorder) {
// write your code here
if (inorder == null || postorder == null || inorder.length != postorder.length) {
return null;
}
return helper(inorder, 0, inorder.length - 1, postorder, 0, postorder.length - 1);
}
TreeNode helper(int[] inorder, int in_start, int in_end,
int[] postorder, int p_start, int p_end) {
if (in_start > in_end) {
return null;
}
int key = postorder[p_end];
TreeNode root = new TreeNode(key);
int pos = findRoot(inorder, in_start, in_end, key);
root.left = helper(inorder, in_start, pos - 1,
postorder, p_start, p_start + pos - in_start - 1);
root.right = helper(inorder, pos + 1, in_end,
postorder, p_end - (in_end - pos), p_end - 1);
return root;
}
int findRoot(int[] inorder, int in_start, int in_end, int key) {
for(int i = in_start; i <= in_end; i++) {
if (inorder[i] == key) {
return i;
}
}
return -1;
}
}