public class BST<E extends Comparable<E>>{ private class Node{ public E e; public Node left, right; public Node(E e){ this.e = e; this.left = null; this.right = null; } } private Node root; private int size; // 节点个数 public BST(){ root = null; size = 0; } public int size(){ return size; } public boolean isEmpty(){ return 0 == size; } // 向二分搜索树中添加新的元素 e public void add(E e){ root = add(root, e); } // 向以 node为根的二分搜索树中插入元素 e,递归算法 // 返回插入新节点后二分搜索树的根 private Node add(Node node, E e){ if(null == node){ size++; return new Node(e); } if(e.compareTo(node.e) < 0){ node.left = add(node.left, e); }else if(e.compareTo(node.e) > 0){ node.right = add(node.right, e); } return node; } // 查看二分搜索树中是否包含元素 e public boolean contains(E e){ return contains(root, e); } // 查看以 node 为根的二分搜索树中是否包含元素 e,递归算法 private boolean contains(Node node, E e){ if(null == node){ return true; } if(0 == e.compareTo(node.e )){ return true; }else if(0 > e.compareTo(node.e)){ return contains(node.left, e); }else // if(0 < e.compareTo(node.e)) return contains(node.right, e); } // 二分搜索树的前序遍历 public void preOrder(){ preOrder(root); } // 前序遍历以 node 为根的二分搜索树,递归算法 private void preOrder(Node node){ if(null == node){ return; } System.out.println(node.e); preOrder(node.left); preOrder(node.right); } @Override public String toString(){ StringBuilder res = new StringBuilder(); generateBSTString(root, 0, res); return res.toString(); } // 生成以 node 为根节点,深度为 depth 的描述二叉树的字符串 private void generateBSTString(Node node, int depth, StringBuilder res){ if(null == node){ res.append(generateDepthString(depth) + "null\n"); return; } res.append(generateDepthString(depth) + node.e + "\n"); generateBSTString(node.left, depth + 1, res); generateBSTString(node.right, depth + 1, res); } private String generateDepthString(int depth){ StringBuilder res = new StringBuilder(); for(int i = 0; i < depth; i++){ res.append("-"); } return res.toString(); } public static void main(String[] args){ BST<Integer> bst = new BST<>(); int[] nums = {5, 3, 6, 8, 4, 2}; for(int num: nums){ bst.add(num); } bst.preOrder(); System.out.println(); System.out.println(bst); } }
///////////////// // 5 // // / \ // // 3 6 // // / \ \ // // 2 4 8 // /////////////////
输出结果为:5 3 2 4 6 8