栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

平衡二叉树Java

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

平衡二叉树Java

为什么要引入平衡二叉树?

答:因为二叉排序树可能出现极端情况,比如1是根节点,2,3,4,5都是它们各自的右子树,这种情况和链表一样,插入和删除效率高,但是查询效率极低。引入平衡二叉树可以保证在插入和删除效率高的同时,查询效率也较高。

平衡二叉树具有以下特点:

       平衡二叉树是一颗空树或它的两个子树的高度差的绝对值不超过1,并且左右两个子树都是一颗平衡二叉树。

平衡二叉树在添加节点时需要根据左右子树的高度进行左旋转或者右旋转,代码如下:

    public int leftHeight() {
        if (left == null) {
            return 0;
        }
        return left.height();
    }

    
    public int rightHeight() {
        if (right == null) {
            return 0;
        }
        return right.height();
    }
    
    
    public int height() {
        return Math.max(left == null ? 0 : left.height(), right == null ? 0 : right.height()) + 1;
    }

    
    private void leftRotate() {

        //用当前节点的值创建一个新节点
        Node newNode = new Node(value);
        //把新节点的左子树设置成当前节点的左子树
        newNode.left = left;
        //把新节点的右子树设置成当前节点的右子树的左子树
        newNode.right = right.left;
        //把当前节点的值替换成右子节点的值
        value = right.value;
        //把当前节点的右子树设置成当前节点的右子树的右子树
        right = right.right;
        //把当前节点的左子节点设置成新创建的节点
        left = newNode;

    }

    
    public void rightRotate() {
        Node newNode = new Node(value);
        newNode.right = right;
        newNode.left = left.right;
        value = left.value;
        left = left.left;
        right = newNode;
    }

    
    public void add( Node node ) {
        if ( node == null ) {
            return;
        }

        if ( node.value < this.value ) {
            if ( this.left == null ) {
                this.left = node;
            } else {
                //向左递归
                this.left.add(node);
            }
        } else {
            if ( this.right == null ) {
                this.right = node;
            } else {
                //向右递归
                this.right.add(node);
            }
        }

        if (rightHeight() - leftHeight() > 1) {
            if ( right != null && right.leftHeight() > right.rightHeight() ) {
                right.rightRotate();
                leftRotate();
            } else {
                leftRotate();
            }
            return;
        }

        if (leftHeight() - rightHeight() > 1) {
            if (left != null && left.rightHeight() > left.leftHeight()) {
                left.leftRotate();
                rightRotate();
            } else {
                rightRotate();
            }

        }
    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/732473.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号