二叉排序树

/**
 * @author chenyi
 * @Description 二叉排序树
 * @date 2022/2/23 10:12
 */
public class BinarySortTreeDemo {

    Node root;

    public static void main(String[] args) {
        int[] arr = {7, 3, 10, 12, 5, 1, 9, 2};
        BinarySortTreeDemo treeDemo = new BinarySortTreeDemo();
        for (int i : arr) {
            treeDemo.add(i);
        }
        treeDemo.perOrder();
        System.out.println("测试删除节点");
        treeDemo.del(1);
        treeDemo.del(2);
        treeDemo.del(3);
        treeDemo.del(5);
        treeDemo.del(0);
        treeDemo.perOrder();
    }

    public void add(int val) {
        if (root == null) {
            root = new Node(val);
            return;
        }
        Node node = new Node(val);
        Node temp = root;
        Node parent;
        do {
            parent = temp;
            temp = temp.value > val ? temp.left : temp.right;
        } while (temp != null);
        if (parent.value > val) {
            parent.left = node;
        } else {
            parent.right = node;
        }
    }

    public void del(int val) {
        Node temp = this.root;
        Node parent = null;
        while (temp != null && temp.value!=val) {
            parent = temp;
            temp = temp.value > val ? temp.left : temp.right;
        }
        if(temp == null) {
            // 没有找到val匹配的节点
            return;
        }

        if(temp.left == null && temp.right == null) {
            // 删除叶子节点
            if(parent == null) {
                this.root = null;
                return;
            }
            if(parent.left == temp) {
                parent.left = null;
            } else {
                parent.right = null;
            }
        } else if(temp.left != null && temp.right != null) {
            // 删除有两个子树
            // 找到右子树中最小的节点,用最小节点的值替换当前节点的值,删除最小的节点
            Node minNode = temp.right;
            Node minNodeParent = temp;
            while (minNode.left!= null){
                minNodeParent = minNode;
                minNode = minNode.left;
            }
            temp.value = minNode.value;
            if(minNodeParent.left == minNode) {
                minNodeParent.left = null;
            } else {
                minNodeParent.right = null;
            }
        } else {
            // 删除只有一个子树
            if(parent.left == temp) {
                parent.left = temp.left==null ? temp.right : temp.left;
            } else {
                parent.right = temp.left==null ? temp.right : temp.left;
            }
        }
    }


    public void perOrder() {
        System.out.println();
        perOrder(this.root);
        System.out.println();
    }

    private void perOrder(Node node) {
        if (node == null) {
            return;
        }
        perOrder(node.left);
        System.out.print(node.value+ " ");
        perOrder(node.right);
    }


    class Node {
        int value;
        Node left;
        Node right;
        public Node(int value) {
            this.value = value;
        }

        @Override
        public String toString() {
            return "Node{" + "value=" + value + '}';
        }

    }

}


©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容