public class BST<Key> {
private Key key;
private BST left;
private BST right;
public BST(Key key, BST<Key> left, BST<Key> right) {
this.key = key;
this.left = left;
this.right = right;
}
public BST(Key key) {
this.key = key;
}
public static void main(String[] args) {
BST<Integer> root = new BST<>(D);
root.left = new BST<>(B);
root.right = new BST<>(F);
root.left.left = new BST<>(A);
root.left.right = new BST<>(C);
root.right.left = new BST<>(E);
root.right.right = new BST<>(G);
}
}
private void printLevel(BST<Key> node, int level) {
if (node == null) return;
if (level == 1) {
System.out.print(node.key + " ");
} else {
printLevel(node.left, level - 1);
printLevel(node.right, level - 1);
}
}
public void levelOrderTraversal() {
int height = height(this);
for (int i = 1; i <= height; i++) {
printLevel(this, i);
}
}
private int height(BST<Key> node) {
if (node == null) return 0;
return 1 + Math.max(height(node.left), height(node.right));
}
public void preOrderTraversal() {
System.out.print(key + " ");
if (left != null) {
left.preOrderTraversal();
}
if (right != null) {
right.preOrderTraversal();
}
}
public void inOrderTraversal() {
if (left != null) {
left.inOrderTraversal();
}
System.out.print(key + " ");
if (right != null) {
right.inOrderTraversal();
}
}
public void inOrderTraversal() {
if (left != null) {
left.inOrderTraversal();
}
if (right != null) {
right.inOrderTraversal();
}
System.out.print(key + " ");
}