diff --git a/tree/BST.java b/tree/BST.java new file mode 100644 index 0000000..3522c6e --- /dev/null +++ b/tree/BST.java @@ -0,0 +1,120 @@ +import java.util.Collections; +import java.util.List; +import java.util.LinkedList; +import java.util.Queue; + +import java.util.stream.Stream; +import java.util.stream.IntStream; + +public class BST> { + + private static class Node { + Node left = null; + Node right = null; + T value; + Node(T val) { + value = val; + } + } + + private Node root = null; + + public BST() {} + + public Node find(T val) { + return val == null ? null : find(root, val); + } + + public void add(T val) { + if (val == null) { + throw new IllegalArgumentException("argument can't be null"); + } + if (root == null) { + root = new Node(val); + } + else { + add(root, val); + } + } + + private void add(Node node, T val) { + if (less(val, node.value)) { + if (node.left == null) { + node.left = new Node(val); + } + else { + add(node.left, val); + } + } + else { + if (node.right == null) { + node.right = new Node(val); + } + else { + add(node.right, val); + } + } + } + + private Node find(Node node, T val) { + if (node == null || val == null) { + return null; + } + else { + Node result; + if (less(val, node.value)) { + result = find(node.left, val); + } + else { + result = find(node.right, val); + } + return result; + } + } + + private boolean less(T k1, T k2) { + return k1.compareTo(k2) <= 0; + } + + public List inOrder() { + if (root == null) { + return Collections.emptyList(); + } + List list = new LinkedList<>(); + inOrder(root, list); + return list; + } + + private void inOrder(Node node, List list) { + if (node.left != null) inOrder(node.left, list); + list.add(node.value); + if (node.right != null) inOrder(node.right, list); + } + + public List levelOrder() { + if (root == null) { + return Collections.emptyList(); + } + List list = new LinkedList<>(); + Queue> nodeQueue = new LinkedList<>(); + nodeQueue.add(root); + while(!nodeQueue.isEmpty()) { + Node node = nodeQueue.poll(); + list.add(node.value); + if (node.left != null) nodeQueue.add(node.left); + if (node.right != null) nodeQueue.add(node.right); + } + return list; + } + + public static void main(String[] args) { + BST bst = new BST<>(); + //IntStream.rangeClosed(1, 10).forEach(i -> bst.add(i)); + + Stream.of(new Integer[]{3, 1, 5, 2, 4}).forEach(i -> bst.add(i)); + + System.out.println("level order = " + bst.levelOrder()); + System.out.println("in order = " + bst.inOrder()); + } +} +