一天一个算法——>平衡二叉树的插入

简介: 一天一个算法——>平衡二叉树的插入
package tree;
/**
 * 平衡二叉树(AVL树)
 * 这里只模拟int类型实现,如果需要其他类型,请将int类型修改为泛型,并实现extends Comparable<T>接口,方便比较
 * 动态模拟实现:https://www.cs.usfca.edu/~galles/visualization/AVLtree.html
 * GitHub地址:https://github.com/hack-feng/algorithm
 */
public class AVLTree{
    private Node root;
    static class Node{
        int data;
        Node left;
        Node right;
        int height;
        Node(Node left, Node right, int data) {
            this.left = left;
            this.right = right;
            this.data = data;
            this.height = 0;
        }
    }
    // 插入节点
    private void insert(int data){
        root = insert(data, root);
    }
    private Node insert(int data, Node node){
        if(node == null){
            Node returnNode =  new Node(null, null, data);
            // 新创建的树,高度默认为1
            returnNode.height = 1;
            return returnNode;
        }else{
            // 如果root.data的值大于data, 则在左子树上插入,否则在右子树上插入
            if(node.data > data){
                node.left = insert(data, node.left);
                // 判断树是否失衡,失衡需要旋转
                if(getHeight(node.left) > getHeight(node.right) + 1){
                    // 判断进行两次旋转还是一次旋转
                    if(node.left.data > data){
                        //(LL)一次旋转, 右旋
                        node = LL(node);
                    }else{
                        //(LR)两次旋转, 先左旋,再右旋
                        node = LR(node);
                    }
                }
            }else{
                node.right = insert(data, node.right);
                // 判断树是否失衡,失衡需要旋转
                if(getHeight(node.right) > getHeight(node.left) + 1){
                    // 判断进行两次旋转还是一次旋转
                    if(node.right.data > data){
                        //(RL)两次旋转,先右旋,再左旋
                        node = RL(node);
                    }else{
                        //(RR)一次旋转,左旋
                        node = RR(node);
                    }
                }
            }
            // 重新计算树的高度
            node.height = setHeight(node);
            return node;
        }
    }
    // 左左情况, 进行一次右旋
    private Node LL(Node node){
        Node leftNode = node.left;
        node.left = leftNode.right;
        leftNode.right = node;
        //重新计算高度
        node.height = setHeight(node);
        leftNode.height = setHeight(leftNode);
        return leftNode;
    }
    // 左右情况, 先进行左旋,再进行一次右旋
    private Node LR(Node node){
        node.left = RR(node.left);
        node = LL(node);
        return node;
    }
    // 右右情况, 进行一次左旋
    private Node RR(Node node){
        Node rightNode = node.right;
        node.right = rightNode.left;
        rightNode.left = node;
        //重新计算高度
        node.height = setHeight(node);
        rightNode.height = setHeight(rightNode);
        return rightNode;
    }
    // 右左情况,先进行右旋,再进行一次左旋
    private Node RL(Node node){
        node.right = LL(node.right);
        node = RR(node);
        return node;
    }
    // 获取树的高度
    private int getHeight(Node node){
        return node == null ? 0 : node.height;
    }
    // 重新计算树的高度
    private int setHeight(Node node){
        return Math.max(getHeight(node.left), getHeight(node.right)) + 1;
    }
    // 打印节点
    private void printNode(Node root){
        if(root != null){
            printNode(root.left);
            System.out.println(root.data);
            printNode(root.right);
        }
    }
    public static void main(String [] args){
//        int[] dataArray = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9};
        int[] dataArray = new int[]{2, 8, 5, 6, 7, 4, 3, 1, 9};
        AVLTree tree = new AVLTree();
        for (int i : dataArray) {
            tree.insert(i);
        }
        tree.printNode(tree.root);
    }
}
目录
相关文章
|
6月前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-7 算法训练 逆序对 平衡二叉树
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-7 算法训练 逆序对 平衡二叉树
54 0
|
1月前
|
存储 算法 数据管理
数据结构与算法学习二零:二叉排序树(BST)、平衡二叉树(AVL)
这篇文章通过需求分析、代码实现和测试验证,详细介绍了二叉排序树的创建、遍历和删除操作,以及二叉平衡树(AVL)的自平衡特性和单旋转操作,旨在提高树结构在数据管理中的效率和性能。
25 0
数据结构与算法学习二零:二叉排序树(BST)、平衡二叉树(AVL)
|
5月前
|
存储 算法
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
|
5月前
|
算法
数据结构和算法学习记录——平衡二叉树(基本介绍、平衡因子、平衡二叉树的定义、平衡二叉树的高度)
数据结构和算法学习记录——平衡二叉树(基本介绍、平衡因子、平衡二叉树的定义、平衡二叉树的高度)
51 0
|
6月前
|
算法 前端开发
前端算法-平衡二叉树
前端算法-平衡二叉树
|
算法 Python
Python算法——平衡二叉树(AVL)
Python算法——平衡二叉树(AVL)
189 2
|
算法
代码随想录算法训练营第十七天 | LeetCode 110. 平衡二叉树、257. 二叉树的所有路径、404. 左叶子之和
代码随想录算法训练营第十七天 | LeetCode 110. 平衡二叉树、257. 二叉树的所有路径、404. 左叶子之和
42 0
算法训练Day18|● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和
算法训练Day18|● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和
|
算法 Java
Java数据结构与算法分析(九)AVL树(平衡二叉树)
AVL(Adelson-Velskii 和 Landis)树是带有平衡条件的二叉查找树,又叫做平衡二叉树。在AVL树中任何节点的两个子树高度差最多为1,所以它又被称为高度平衡树。
109 0
|
算法 JavaScript Serverless
日拱算法之判断平衡二叉树
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。