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

平衡二叉树(AVL树)

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

平衡二叉树(AVL树)

应用案例-单旋转(左旋转) 

 

AVL高度求解
package avl;

public class AVLTreeDemo {
    public static void main(String[] args) {
        int arr[]=new int[]{4,3,6,5,7,8};
        //创建一个AVLTree对象
        AVLTree avlTree = new AVLTree();
        //添加节点
        for (int i=0;i node.value){
            if (this.left != null){
                this.left.add(node);
            }else {
                this.left = node;
            }
        }else {  // 如果value相等 也走右边节点
            if (this.right != null){
                this.right.add(node);
            }else {
                this.right = node;
            }
        }
    }

    // 中序遍历
    public void infixOrder(){
        if(this.left != null){
            this.left.infixOrder();
        }
        System.out.print(this.value+" ");
        if (this.right != null){
            this.right.infixOrder();
        }
    }
    
    public Node search (int value){
        if (value == this.value) { // 找到就是该节点
            return this;
        }else if (value < this.value){//如果查找的值小于当前结点,向左子树递归查找
            if(this.left != null){
                return left.search(value);
            }else {
                return null;
            }
        }else {  //如果查找的值不小于当前结点,向右子树递归查找
            if(this.right != null){
                return this.right.search(value);
            }else {
                return null;
            }
        }
    }
    
    public Node searchParent(int value){
        //如果当前结点就是要删除的结点的父节点,就返回
        if (this.left != null && this.left.value == value){
            return this;
        }else if(this.right != null && this.right.value == value){
            return this;
        }else {
            // 如果查找的值 小于当前节点的值 , 并且当前的节点左子节点不为空
            if(value < this.value && this.left != null){
                return this.left.searchParent(value);//向左子树递归查找
            }else if(value >= this.value && this.right != null){
                return this.right.searchParent(value);//向右子树递归查找
            }else {
                // 真的找不到了 没有父节点
                return null;
            }
        }
    }




    @Override
    public String toString() {
        return "Node{" +
                "value=" + value +
                ", left=" + left +
                ", right=" + right +
                '}';
    }
}
输出:

AVL树左旋转代码实现 在Node类中新增左旋转方法
    //左旋转方法
    private void leftRotate(){
        //创建新的结点。以当前根节点的值
        Node newNode = new Node(value);
        //把新节点的左子树设置成当前结点的左子树
        newNode.left=left;
        //把新节点的右子树设置成当前结点的右子树的左子树
        newNode.right=right.left;
        //把当前结点的值替换成右子结点的值
        value=right.value;
        //把当前结点的右子树设置成当前结点的右子树的右子树
        right=right.right;
        //把当前结点的左子树(左子节点)设置成新的结点
        left=newNode;
    }
在Node类中修改添加节点方法、
  // 添加节点的方法
    // 递归添加节点,主义需要满足二叉排序树的要求
    public void add(Node node){
        if (node == null){
            return;
        }
        if(this.value > node.value){
            if (this.left != null){
                this.left.add(node);
            }else {
                this.left = node;
            }
        }else {  // 如果value相等 也走右边节点
            if (this.right != null){
                this.right.add(node);
            }else {
                this.right = node;
            }
        }
        //当添加完一个节点后,如果:(右子树的高度-左子树的高度>1 就进行坐旋转)
        if (righttHeight()-leftHeight()>1){
            leftRotate();
        }
    }

测试!!

右旋转:

当未进行右旋转时,测试一下

    public static void main(String[] args) {

        int arr[]=new int[]{10,12,8,9,7,6};
        //创建一个AVLTree对象
        AVLTree avlTree = new AVLTree();
        //添加节点
        for (int i=0;i

修改添加方法
  // 添加节点的方法
    // 递归添加节点,主义需要满足二叉排序树的要求
    public void add(Node node){
        if (node == null){
            return;
        }
        if(this.value > node.value){
            if (this.left != null){
                this.left.add(node);
            }else {
                this.left = node;
            }
        }else {  // 如果value相等 也走右边节点
            if (this.right != null){
                this.right.add(node);
            }else {
                this.right = node;
            }
        }
        //当添加完一个节点后,如果:(右子树的高度-左子树的高度>1 就进行左旋转)
        if (righttHeight()-leftHeight()>1){
            leftRotate();
        }
        //当添加完一个节点后,如果:(左子树的高度-右子树的高度>1 就进行右旋转)
        if (leftHeight()-righttHeight()>1){
            rightRotate();
        }
    }
 测试
public static void main(String[] args) {

        int arr[]=new int[]{10,12,8,9,7,6};
        //创建一个AVLTree对象
        AVLTree avlTree = new AVLTree();
        //添加节点
        for (int i=0;i

输出

AVL树双旋转图解和实现

修改测试用例以及测试结果

发现旋转后依旧不平衡

图解   修改Node中的add方法
  // 添加节点的方法
    // 递归添加节点,主义需要满足二叉排序树的要求
    public void add(Node node){
        if (node == null){
            return;
        }
        if(this.value > node.value){
            if (this.left != null){
                this.left.add(node);
            }else {
                this.left = node;
            }
        }else {  // 如果value相等 也走右边节点
            if (this.right != null){
                this.right.add(node);
            }else {
                this.right = node;
            }
        }
        //当添加完一个节点后,如果:(右子树的高度-左子树的高度>1 就进行左旋转)
        if (righttHeight()-leftHeight()>1){
            //如果它的右子树的左子树的高度大于它的右子树的右子树的高度
            if (right!=null&&right.leftHeight()>right.righttHeight()){
                //先对右子结点进行右旋转
                right.rightRotate();
                //然后对当前结点进行左旋转
                leftRotate();
            }else {
                //直接进行左旋转即可
                leftRotate();
          }
          return;  //必须要有!!!*/
        }
        //当添加完一个节点后,如果:(左子树的高度-右子树的高度>1 就进行右旋转)
        if (leftHeight()-righttHeight()>1){
            //如果它的左子树的右子树大于它的左子树高度
            if (left!=null&&left.righttHeight()>left.leftHeight()){
                //先对当前结点的左结点(左子树)进行左旋转
                left.leftRotate();
                //再对当前结点进行右旋转
                rightRotate();
            }else {
                //直接进行右旋转即可
                rightRotate();
           }

        }
    }

测试

 public static void main(String[] args) {

        int arr[]=new int[]{10,11,7,6,8,9};

        //创建一个AVLTree对象
        AVLTree avlTree = new AVLTree();
        //添加节点
        for (int i=0;i

输出

完整代码
package avl;

public class AVLTreeDemo {
    public static void main(String[] args) {

        int arr[]=new int[]{10,11,7,6,8,9};

        //创建一个AVLTree对象
        AVLTree avlTree = new AVLTree();
        //添加节点
        for (int i=0;i node.value){
            if (this.left != null){
                this.left.add(node);
            }else {
                this.left = node;
            }
        }else {  // 如果value相等 也走右边节点
            if (this.right != null){
                this.right.add(node);
            }else {
                this.right = node;
            }
        }
        //当添加完一个节点后,如果:(右子树的高度-左子树的高度>1 就进行左旋转)
        if (righttHeight()-leftHeight()>1){
            //如果它的右子树的左子树的高度大于它的右子树的右子树的高度
            if (right!=null&&right.leftHeight()>right.righttHeight()){
                //先对右子结点进行右旋转
                right.rightRotate();
                //然后对当前结点进行左旋转
                leftRotate();
            }else {
                //直接进行左旋转即可
                leftRotate();
          }
          return;  //必须要有!!!*/
        }
        //当添加完一个节点后,如果:(左子树的高度-右子树的高度>1 就进行右旋转)
        if (leftHeight()-righttHeight()>1){
            //如果它的左子树的右子树大于它的左子树高度
            if (left!=null&&left.righttHeight()>left.leftHeight()){
                //先对当前结点的左结点(左子树)进行左旋转
                left.leftRotate();
                //再对当前结点进行右旋转
                rightRotate();
            }else {
                //直接进行右旋转即可
                rightRotate();
           }

        }
    }

    // 中序遍历
    public void infixOrder(){
        if(this.left != null){
            this.left.infixOrder();
        }
        System.out.print(this.value+" ");
        if (this.right != null){
            this.right.infixOrder();
        }
    }

    //左旋转方法
    private void leftRotate(){
        //创建新的结点。以当前根节点的值
        Node newNode = new Node(value);
        //把新节点的左子树设置成当前结点的左子树
        newNode.left=left;
        //把新节点的右子树设置成当前结点的右子树的左子树
        newNode.right=right.left;
        //把当前结点的值替换成右子结点的值
        value=right.value;
        //把当前结点的右子树设置成当前结点的右子树的右子树
        right=right.right;
        //把当前结点的左子树(左子节点)设置成新的结点
        left=newNode;
    }

    //右旋转方法
    private void rightRotate(){
        Node newNode = new Node(value);
        newNode.right=right;
        newNode.left=left.right;
        value=left.value;
        left=left.left;
        right=newNode;
    }
    
    public Node search (int value){
        if (value == this.value) { // 找到就是该节点
            return this;
        }else if (value < this.value){//如果查找的值小于当前结点,向左子树递归查找
            if(this.left != null){
                return left.search(value);
            }else {
                return null;
            }
        }else {  //如果查找的值不小于当前结点,向右子树递归查找
            if(this.right != null){
                return this.right.search(value);
            }else {
                return null;
            }
        }
    }
    
    public Node searchParent(int value){
        //如果当前结点就是要删除的结点的父节点,就返回
        if (this.left != null && this.left.value == value){
            return this;
        }else if(this.right != null && this.right.value == value){
            return this;
        }else {
            // 如果查找的值 小于当前节点的值 , 并且当前的节点左子节点不为空
            if(value < this.value && this.left != null){
                return this.left.searchParent(value);//向左子树递归查找
            }else if(value >= this.value && this.right != null){
                return this.right.searchParent(value);//向右子树递归查找
            }else {
                // 真的找不到了 没有父节点
                return null;
            }
        }
    }




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

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

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

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