// 二分查找public class BST {    private TreeNode root;        public TreeNode getRoot() {        return root;    }    public void setRoot(TreeNode root) {        this.root = root;    }        // 每个树节点    static class TreeNode {        public int value;// 值        public TreeNode left;        public TreeNode right;                public TreeNode(int value){            this.value = value;        }    }        // 查找办法    public TreeNode get(int key){        TreeNode current = root;        while (current != null && current.value != key){            if(key < current.value){                current = current.left;            } else if(key > current.value){                current = current.right;            }        }                return current == null ? null : current;        }        // insert 办法 (插入)    public void insert(int key){        // 如果根节点为null,就把key插入到根节点        if(root == null){            root = new TreeNode(key);            return;        }                TreeNode current = root;        TreeNode parent = null;// 要插入的地位的父亲                while(true) {            parent = current;            // 如果要插入的key 小于 根节点, 则到右边查找            if(key < parent.value){                current = parent.left;                // 如果根节点的左子树的 节点为null, 直接插入                if(current == null){                    parent.left = new TreeNode(key);                    return;                }                }            // 如果要插入的key 大于 根节点, 则到左边查找            else if(key > parent.value ){                current = parent.right;                if(current == null){                    parent.right = new TreeNode(key);                    return;                }            }            // 阐明以后存在的值曾经存在了            else{                return;            }        }    }        // 删除办法    public boolean delete(int key){        TreeNode parent = root; // 要删除节点的父节点        TreeNode current = root;                boolean isLeftChild = false; // 是不是左节点        // 删除之前先找 这个节点        while(current != null && current.value != key){            parent = current;            if(current.value > key){                isLeftChild = true;                current = current.left;            } else {                isLeftChild = false;                current = current.right;            }        }                // 没有找到对应的数据        if(current == null){            return false;        }        // Case1 1 : if node to be delete has no Children        if(current.left == null && current.right == null){            if(current == root){                root = null;            } else if(isLeftChild) {                parent.left = null;            } else {                parent.right = null;            }        }        // Case1 2 : if node to be delete has one Children        else if(current.right == null){            if(current == root){                root = current.left;            } else if(isLeftChild){                parent.left = current.left;            } else {                parent.right = current.left;            }                    }        else if(current.left == null){            if(current ==root){                root = current.right;            } else if(isLeftChild){                parent.left = current.right;            } else {                parent.right = current.right;            }        }        // Case1 3 : if node to be delete has two Children;  current.left != null && current.right != null        else {            TreeNode successor = getSuccessor(current);            if(current == root){                root = successor;            } else if(isLeftChild){                parent.left = successor;            }else{                parent.right = successor;            }                        successor.left = current.left;        }        return true;    }        // 这个是用来找右子树上面最小的节点.    private TreeNode getSuccessor(TreeNode node){        TreeNode successor = null;        TreeNode successorParent = null;        TreeNode current = node.right;                // 找到最小的节点,终止条件是:节点为null        while(current != null){            successorParent = successor;            successor = current;            current = current.left;        }                if(successor != node.right){            successorParent.left = successor.right;            successor.right = node.right;        }        return successor;            }        // 遍历办法        /**     * Pre-order Traversal: 先拜访节点本人,然年后拜访左子树,最初在拜访右子树     */    public static void preOrderTraversal(TreeNode root){        if(root == null){            return;        }                System.out.println(root.value);        preOrderTraversal(root.left);        preOrderTraversal(root.right);            }        /**     * In-order Traversal: 先拜访左子树上的节点,在拜访本人,最初再拜访右子树上的节点     *      * 遍历进去饿的数据,是排好程序的     */    public static void inOrderTraversal(TreeNode root){        if(root == null){            return;        }        inOrderTraversal(root.left);        System.out.println(root.value);        inOrderTraversal(root.right);            }    /**     * Post-order Traversal:先拜访左右子树,最初在拜访本人     */    public static void postOrderTraversal(TreeNode root){        if(root == null){            return;        }        postOrderTraversal(root.left);        postOrderTraversal(root.right);        System.out.println(root.value);    }        public static void main(String[] args) {        // Test        BST bst = new BST();                bst.insert(50);        bst.insert(36);        bst.insert(88);        bst.insert(77);                BST.inOrderTraversal(bst.getRoot());        System.out.println();        BST.preOrderTraversal(bst.getRoot());        System.out.println();        BST.postOrderTraversal(bst.getRoot());            }