Related:
Construct a Binary Search Tree from given postorder
https://leetcode.com/problems/construct-binary-search-tree-from-preorder-traversal/discuss/252232/JavaC%2B%2BPython-O(N)-Solution
http://www.noteanddata.com/leetcode-1008-Construct-Binary-Search-Tree-from-Preorder-Traversal-java-solution-note.htmlhttps://leetcode.com/problems/construct-binary-search-tree-from-preorder-traversal/discuss/252232/JavaC%2B%2BPython-O(N)-Solution
Find the left part and right part,
then recursively construct the tree.
then recursively construct the tree.
Solution 1:
Time:
O(HlogN)
def bstFromPreorder(self, A):
if not A: return None
root = TreeNode(A[0])
i = bisect.bisect(A, A[0])
root.left = self.bstFromPreorder(A[1:i])
root.right = self.bstFromPreorder(A[i:])
return root
Solution 2
Give the function a bound the maximum number it will handle.
The left recursion will take the elements smaller than
The right recursion will take the remaining elements smaller than
The left recursion will take the elements smaller than
node.val
The right recursion will take the remaining elements smaller than
bound
Time:
O(N)
int i = 0;
public TreeNode bstFromPreorder(int[] A) {
return bstFromPreorder(A, Integer.MAX_VALUE);
}
public TreeNode bstFromPreorder(int[] A, int bound) {
if (i == A.length || A[i] > bound) return null;
TreeNode root = new TreeNode(A[i++]);
root.left = bstFromPreorder(A, root.val);
root.right = bstFromPreorder(A, bound);
return root;
}
X. https://leetcode.com/problems/construct-binary-search-tree-from-preorder-traversal/discuss/252754/Java-Stack-Iterative-Solution public TreeNode bstFromPreorder(int[] preorder) {
if (preorder == null || preorder.length == 0) {
return null;
}
Stack<TreeNode> stack = new Stack<>();
TreeNode root = new TreeNode(preorder[0]);
stack.push(root);
for (int i = 1; i < preorder.length; i++) {
TreeNode node = new TreeNode(preorder[i]);
if (preorder[i] < stack.peek().val) {
stack.peek().left = node;
} else {
TreeNode parent = stack.peek();
while (!stack.isEmpty() && preorder[i] > stack.peek().val) {
parent = stack.pop();
}
parent.right = node;
}
stack.push(node);
}
return root;
}
平均O(N*lgN), 最差O(N^2), 相当于对于树的每一层,都对N个元素做了一次访问, 树高平均是lgN, 最差是N
public TreeNode bstFromPreorder(int[] preorder) {
return tree(preorder, 0, preorder.length-1);
}
public TreeNode tree(int[] preorder, int from, int to) {
if(from > to) return null;
TreeNode root = new TreeNode(preorder[from]);
boolean found = false;
for(int i = from+1; i <= to; ++i) {
if(preorder[i] > preorder[from]) {
root.left = tree(preorder, from+1, i-1);
root.right = tree(preorder, i, to);
found = true;
break;
}
}
if(!found) {
root.left = tree(preorder, from+1, to);
}
return root;
}
public TreeNode deserializeArrayOptimized(int[] postorder, int[] currIndex, int min, int max)
{
if
(currIndex[0] < 0)
return
null
;
TreeNode root =
null
;
if
((postorder[currIndex[0]] > min) && (postorder[currIndex[0]] < max))
{
root =
new
TreeNode(postorder[currIndex[0]]);
currIndex[0] -= 1;
root.right = deserializeArrayOptimized(postorder, currIndex, root.val, max);
root.left = deserializeArrayOptimized(postorder, currIndex, min, root.val);
}
return
root;
}
private int findDivision(int[] postorder, int value, int low, int high)
{
int i = high;
for
(; i >= low; i--)
{
if
(value > postorder[i])
break
;
}
return
i;
}
public TreeNode deserializeArray(int[] postorder, int low, int high)
{
if
(low > high)
return
null
;
TreeNode root =
new
TreeNode(postorder[high]);
int divIndex = findDivision(postorder, root.val, low, high - 1);
root.left = deserializeArray(postorder, low, divIndex);
root.right = deserializeArray(postorder, divIndex + 1, high - 1);
return
root;
}
Construct a Binary Search Tree from given postorder - GeeksforGeeks
Related: Construct BST from given preorder traversal
Given postorder traversal of a binary search tree, construct the BST.
For example, if the given traversal is {1, 7, 5, 50, 40, 10}, then following tree should be constructed and root of the tree should be returned.
10 / \ 5 40 / \ \ 1 7 50
Method 2 ( O(n) time complexity )
The trick is to set a range {min .. max} for every node. Initialize the range as {INT_MIN .. INT_MAX}. The last node will definitely be in range, so create root node. To construct the left subtree, set the range as {INT_MIN …root->data}. If a values is in the range {INT_MIN .. root->data}, the values is part part of left subtree. To construct the right subtree, set the range as {root->data .. INT_MAX}.
The trick is to set a range {min .. max} for every node. Initialize the range as {INT_MIN .. INT_MAX}. The last node will definitely be in range, so create root node. To construct the left subtree, set the range as {INT_MIN …root->data}. If a values is in the range {INT_MIN .. root->data}, the values is part part of left subtree. To construct the right subtree, set the range as {root->data .. INT_MAX}.
https://www.techiedelight.com/build-binary-search-tree-from-postorder-sequence/
Node* buildTree(vector<int> const &postorder, int& pIndex,
int min, int max)
{
// Base case
if (pIndex < 0)
return nullptr;
// Return if next element of postorder traversal from the end
// is not in valid range
int curr = postorder[pIndex];
if (curr < min || curr > max)
return nullptr;
// Construct the root node and decrement pIndex
Node* root = newNode(curr);
pIndex--;
// Construct left and right subtree of the root node.
// Build right subtree before left subtree since the values are
// being read from the end of the postorder sequence
// Since all elements in the right subtree of a BST must be greater
// than the value of root node, set range as [curr+1..max] and recur
root->right = buildTree(postorder, pIndex, curr+1, max);
// Since all elements in the left subtree of a BST must be less
// than the value of root node, set range as [min, curr-1] and recur
root->left = buildTree(postorder, pIndex, min, curr-1);
return root;
}
// Build a binary search tree from its postorder sequence
Node* buildTree(vector<int> const &postorder)
{
// start from the root node (last element in postorder sequence)
int postIndex = postorder.size() - 1;
// set range of the root node as [INT_MIN, INT_MAX] and recur
return buildTree(postorder, postIndex, INT_MIN, INT_MAX);
}
X. https://www.geeksforgeeks.org/construct-a-bst-from-given-postorder-traversal-using-stack/- Push root of the BST to the stack i.e, last element of the array.
- Start traversing the array in reverse, if next element is > the element at the top of the stack then,
set this element as the right child of the element at the top of the stack and also push it to the stack. - Else if, next element is < the element at the top of the stack then,
start popping all the elements from the stack until either the stack is empty or the current element becomes > the element at the top of the stack. - Make this element left child of the last popped node and repeat the above steps until the array is traversed completely.
Method 1 ( O(n^2) time complexity )
The last element of postorder traversal is always root. We first construct the root. Then we find the index of last element which is smaller than root. Let the index be ‘i’. The values between 0 and ‘i’ are part of left subtree, and the values between ‘i+1′ and ‘n-2′ are part of right subtree. Divide given post[] at index “i” and recur for left and right sub-trees.
For example in {1, 7, 5, 40, 50, 10}, 10 is the last element, so we make it root. Now we look for the last element smaller than 10, we find 5. So we know the structure of BST is as following.
10 / \ / \ {1, 7, 5} {50, 40}
We recursively follow above steps for subarrays {1, 7, 5} and {40, 50}, and get the complete tree.
https://www.techiedelight.com/build-binary-search-tree-from-postorder-sequence/
struct Node* constructBST(int postorder[], int start, int end)
{
// base case
if (start > end)
return NULL;
// Construct the root node of the subtree formed by keys of the
// postorder sequence in range [start, end]
struct Node *node = newNode(postorder[end]);
// search the index of last element in current range of postorder
// sequence which is smaller than the value of root node
int i;
for (i = end; i >=start; i--) {
if (postorder[i] < node->key)
break;
}
// Build right subtree before left subtree since the values are
// being read from the end of the postorder sequence
// recursively construct the right subtree
node->right = constructBST(postorder, i + 1, end - 1);
// recursively construct the left subtree
node->left = constructBST(postorder, start, i);
// return current node
return node;
}
http://stackoverflow.com/questions/21173541/construct-binary-search-tree-from-post-order-traversal-in-javapublic static Node buildBinarytreefromPostOrder(int[] post, int start, int end)
{
if (end < start)
return null;
Node root = new Node(post[end]);
if (end == start)
return root;
int i;
for (i = end; i >= start; i--)
if (post[i] < root.data)
break;
root.left = buildBinarytreefromPostOrder(post, start, i);
root.right = buildBinarytreefromPostOrder(post, i + 1, end - 1);
return root;
}
Read full article from Construct a Binary Search Tree from given postorder - GeeksforGeeks