// Java program to construct BST from given preorder traversal
// A binary tree node
class Node {
int data;
Node left, right;
Node(int d) {
data = d;
left = right = null;
}
}
class Index {
int index = 0;
}
class BinaryTree {
Index index = new Index();
// A recursive function to construct Full from pre[]. preIndex is used
// to keep track of index in pre[].
Node constructTreeUtil(int pre[], Index preIndex,
int low, int high, int size) {
// Base case
if (preIndex.index >= size || low > high) {
return null;
}
// The first node in preorder traversal is root. So take the node at
// preIndex from pre[] and make it root, and increment preIndex
Node root = new Node(pre[preIndex.index]);
preIndex.index = preIndex.index + 1;
// If the current subarry has only one element, no need to recur
if (low == high) {
return root;
}
// Search for the first element greater than root
int i;
for (i = low; i <= high; ++i) {
if (pre[i] > root.data) {
break;
}
}
// Use the index of element found in preorder to divide preorder array in
// two parts. Left subtree and right subtree
root.left = constructTreeUtil(pre, preIndex, preIndex.index, i - 1, size);
root.right = constructTreeUtil(pre, preIndex, i, high, size);
return root;
}
// The main function to construct BST from given preorder traversal.
// This function mainly uses constructTreeUtil()
Node constructTree(int pre[], int size) {
return constructTreeUtil(pre, index, 0, size - 1, size);
}
// A utility function to print inorder traversal of a Binary Tree
void printInorder(Node node) {
if (node == null) {
return;
}
printInorder(node.left);
System.
out.
print(node.
data + " "); printInorder(node.right);
}
// Driver program to test above functions
public static void main
(String[] args
) { BinaryTree tree = new BinaryTree();
int pre[] = new int[]{10, 5, 1, 7, 40, 50};
int size = pre.length;
Node root = tree.constructTree(pre, size);
System.
out.
println("Inorder traversal of the constructed tree is "); tree.printInorder(root);
}
}
Ly8gSmF2YSBwcm9ncmFtIHRvIGNvbnN0cnVjdCBCU1QgZnJvbSBnaXZlbiBwcmVvcmRlciB0cmF2ZXJzYWwKIAovLyBBIGJpbmFyeSB0cmVlIG5vZGUKY2xhc3MgTm9kZSB7CiAKICAgIGludCBkYXRhOwogICAgTm9kZSBsZWZ0LCByaWdodDsKIAogICAgTm9kZShpbnQgZCkgewogICAgICAgIGRhdGEgPSBkOwogICAgICAgIGxlZnQgPSByaWdodCA9IG51bGw7CiAgICB9Cn0KIApjbGFzcyBJbmRleCB7CiAKICAgIGludCBpbmRleCA9IDA7Cn0KIApjbGFzcyBCaW5hcnlUcmVlIHsKIAogICAgSW5kZXggaW5kZXggPSBuZXcgSW5kZXgoKTsKICAgICAKICAgIC8vIEEgcmVjdXJzaXZlIGZ1bmN0aW9uIHRvIGNvbnN0cnVjdCBGdWxsIGZyb20gcHJlW10uIHByZUluZGV4IGlzIHVzZWQKICAgIC8vIHRvIGtlZXAgdHJhY2sgb2YgaW5kZXggaW4gcHJlW10uCiAgICBOb2RlIGNvbnN0cnVjdFRyZWVVdGlsKGludCBwcmVbXSwgSW5kZXggcHJlSW5kZXgsCiAgICAgICAgICAgIGludCBsb3csIGludCBoaWdoLCBpbnQgc2l6ZSkgewogICAgICAgICAKICAgICAgICAvLyBCYXNlIGNhc2UKICAgICAgICBpZiAocHJlSW5kZXguaW5kZXggPj0gc2l6ZSB8fCBsb3cgPiBoaWdoKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KIAogICAgICAgIC8vIFRoZSBmaXJzdCBub2RlIGluIHByZW9yZGVyIHRyYXZlcnNhbCBpcyByb290LiBTbyB0YWtlIHRoZSBub2RlIGF0CiAgICAgICAgLy8gcHJlSW5kZXggZnJvbSBwcmVbXSBhbmQgbWFrZSBpdCByb290LCBhbmQgaW5jcmVtZW50IHByZUluZGV4CiAgICAgICAgTm9kZSByb290ID0gbmV3IE5vZGUocHJlW3ByZUluZGV4LmluZGV4XSk7CiAgICAgICAgcHJlSW5kZXguaW5kZXggPSBwcmVJbmRleC5pbmRleCArIDE7CiAKICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBzdWJhcnJ5IGhhcyBvbmx5IG9uZSBlbGVtZW50LCBubyBuZWVkIHRvIHJlY3VyCiAgICAgICAgaWYgKGxvdyA9PSBoaWdoKSB7CiAgICAgICAgICAgIHJldHVybiByb290OwogICAgICAgIH0KIAogICAgICAgIC8vIFNlYXJjaCBmb3IgdGhlIGZpcnN0IGVsZW1lbnQgZ3JlYXRlciB0aGFuIHJvb3QKICAgICAgICBpbnQgaTsKICAgICAgICBmb3IgKGkgPSBsb3c7IGkgPD0gaGlnaDsgKytpKSB7CiAgICAgICAgICAgIGlmIChwcmVbaV0gPiByb290LmRhdGEpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogCiAgICAgICAgLy8gVXNlIHRoZSBpbmRleCBvZiBlbGVtZW50IGZvdW5kIGluIHByZW9yZGVyIHRvIGRpdmlkZSBwcmVvcmRlciBhcnJheSBpbgogICAgICAgIC8vIHR3byBwYXJ0cy4gTGVmdCBzdWJ0cmVlIGFuZCByaWdodCBzdWJ0cmVlCiAgICAgICAgcm9vdC5sZWZ0ID0gY29uc3RydWN0VHJlZVV0aWwocHJlLCBwcmVJbmRleCwgcHJlSW5kZXguaW5kZXgsIGkgLSAxLCBzaXplKTsKICAgICAgICByb290LnJpZ2h0ID0gY29uc3RydWN0VHJlZVV0aWwocHJlLCBwcmVJbmRleCwgaSwgaGlnaCwgc2l6ZSk7CiAKICAgICAgICByZXR1cm4gcm9vdDsKICAgIH0KIAogICAgLy8gVGhlIG1haW4gZnVuY3Rpb24gdG8gY29uc3RydWN0IEJTVCBmcm9tIGdpdmVuIHByZW9yZGVyIHRyYXZlcnNhbC4KICAgIC8vIFRoaXMgZnVuY3Rpb24gbWFpbmx5IHVzZXMgY29uc3RydWN0VHJlZVV0aWwoKQogICAgTm9kZSBjb25zdHJ1Y3RUcmVlKGludCBwcmVbXSwgaW50IHNpemUpIHsKICAgICAgICByZXR1cm4gY29uc3RydWN0VHJlZVV0aWwocHJlLCBpbmRleCwgMCwgc2l6ZSAtIDEsIHNpemUpOwogICAgfQogCiAgICAvLyBBIHV0aWxpdHkgZnVuY3Rpb24gdG8gcHJpbnQgaW5vcmRlciB0cmF2ZXJzYWwgb2YgYSBCaW5hcnkgVHJlZQogICAgdm9pZCBwcmludElub3JkZXIoTm9kZSBub2RlKSB7CiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHByaW50SW5vcmRlcihub2RlLmxlZnQpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnQobm9kZS5kYXRhICsgIiAiKTsKICAgICAgICBwcmludElub3JkZXIobm9kZS5yaWdodCk7CiAgICB9CiAKICAgIC8vIERyaXZlciBwcm9ncmFtIHRvIHRlc3QgYWJvdmUgZnVuY3Rpb25zCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgQmluYXJ5VHJlZSB0cmVlID0gbmV3IEJpbmFyeVRyZWUoKTsKICAgICAgICBpbnQgcHJlW10gPSBuZXcgaW50W117MTAsIDUsIDEsIDcsIDQwLCA1MH07CiAgICAgICAgaW50IHNpemUgPSBwcmUubGVuZ3RoOwogICAgICAgIE5vZGUgcm9vdCA9IHRyZWUuY29uc3RydWN0VHJlZShwcmUsIHNpemUpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW5vcmRlciB0cmF2ZXJzYWwgb2YgdGhlIGNvbnN0cnVjdGVkIHRyZWUgaXMgIik7CiAgICAgICAgdHJlZS5wcmludElub3JkZXIocm9vdCk7CiAgICB9Cn0=