/* package whatever; // don't place package name! */
class BSTCheck
{
/** basic binary tree Node with int value. */
static class Node {
Node left,
right;
int val;
public Node(int v) { val = v; }
public Node(Node l, int val, Node r) {
this(val);
left = l;
right = r;
}
@Override
public String toString
() { return "Node " + val
; } }
/** Checks if the tree rooted at node is a valid binary search tree. */
interface BinarySearchTreeCheck {
/** @return {@code true} if the tree rooted at {@code node}
* is a valid binary search tree. */
boolean isBinarySearchTree(Node node);
}
/** Checks if the tree rooted at a node is a valid binary search tree. */
static class DataMember implements BinarySearchTreeCheck {
/** @return {@code true} if the tree rooted at {@code node}
* is a valid binary search tree. */
@Override
public boolean isBinarySearchTree(Node node) {
return null == node
|| isBinarySearchTree(node.left)
&& previous <= node.val
&& node.val == (previous = node.val) // abuse
&& isBinarySearchTree(node.right);
}
}
/** Checks if the tree rooted at a node is a valid binary search tree. */
static class TwoMethods implements BinarySearchTreeCheck {
/** @return {@code true} if the tree rooted at {@code node}
* is a valid binary search tree. */
@Override
public boolean isBinarySearchTree(Node node) {
return isBinarySearchTree
(Integer.
MIN_VALUE, node
); }
/** @return {@code true} if the tree rooted at {@code node}
* is a valid binary search tree
* containing values no smaller than {@code previous}. */
public boolean isBinarySearchTree(int previous, Node node) {
return null == node
|| isBinarySearchTree(previous, node.left)
&& previous <= node.val
&& isBinarySearchTree(node.val, node.right);
}
}
public static void main
(String[] args
) { // Build a valid BST.
Node variant = new Node(-2),
root = new Node(new Node(null, -2, variant),
0, new Node(2));
for (int i = -3 ; i < 2 ; i++) {
variant.val = i;
new DataMember().isBinarySearchTree(root)
+ '/' + new TwoMethods().isBinarySearchTree(root));
}
}
}