Java 实现平衡二叉树 AVL

简介: Java 实现平衡二叉树 AVL

平衡二叉树(Balanced Binary Tree),也称为AVL树,是一种特殊的二叉搜索树。它的特点是任意节点的左右子树高度差不超过1,即左右子树的高度差的绝对值不超过1。


平衡二叉树的设计旨在提供较快的查找、插入和删除操作,相比于非平衡的二叉搜索树,可以保持树的相对平衡,避免出现退化的情况。


实现平衡二叉树的关键在于保持树的平衡性。当插入或删除节点后,如果不满足平衡条件,则需要通过旋转操作进行调整,使其重新恢复平衡。


常见的平衡二叉树实现有AVL树和红黑树。AVL树是最早提出的平衡二叉树,它通过节点的左右子树高度差进行调整。而红黑树是一种近似平衡的二叉搜索树,通过调整节点的颜色和旋转操作来维持树的平衡。


使用平衡二叉树可以在最坏情况下保证查找、插入和删除等操作的时间复杂度为 O(log n),相对于非平衡二叉搜索树的 O(n),具备更好的性能。


节点

/**
 * @description: 节点
 * @author: Snow
 * @date: 2024/1/23
 * **************************************************
 * 修改记录(时间--修改人--修改说明):
 */
public class Node {

    int val;

    Node left;

    Node right;

    Node(int val){
        this.val = val;
    }

    Node(int val, Node left, Node right){
        this.val = val;
        this.left = left;
        this.right = right;
    }

    /** 添加节点 */
    public void add(Node node){
       if( node.val <= this.val ){
           if( this.left == null ){
               this.left = node;
               return;
           }else{
               this.left.add(node);
           }
       }else{
           if( this.right == null ){
               this.right = node;
               return;
           }else{
               this.right.add(node);
           }
       }
    }

    /** 中序遍历 */
    public void mid(){
        if( this.left != null ){
            this.left.mid();
        }

        System.out.print(this.val + " ");

        if( this.right != null ){
            this.right.mid();
        }
    }

    /** 左旋 */
    public void leftRotate(){
        //  声明一个新的节点 让这个节点的值等于当前节点的值.左节点的值为当前节点的left值,右节点的值为当前节点的right的left的值
        Node newNode = new Node(val, left, right.left);
        // 当前节点的值换为 当前节点的right的值
        this.val = right.val;
        //  新的节点 设置为 当前节点的左边
        this.left = newNode;
        //  当前节点的右节点的右边 设置为 当前节点的右边
        this.right = right.right;
    }
}


平衡二叉树

/**
 * @description: 平衡二叉树
 * @author: Snow
 * @date: 2024/1/23
 * **************************************************
 * 修改记录(时间--修改人--修改说明):
 */
public class BalancedBinaryTree {

    /** 根节点 */
    Node root;

    /** 添加节点 */
    public void add(Node node){
        if( node == null ){
            return;
        }
        if( root == null ){
            root = node;
            return;
        }
        root.add(node);
    }

    /** 遍历 */
    public void traverse(){
        if( root != null ){
            root.mid();
        }
    }

    /**
     * 获取节点高度
     * @param node
     * @return
     */
    public int getHeight(Node node) {
        return Math.max( node.left == null ? 0 : getHeight(node.left), 
        node.right == null ? 0 : getHeight(node.right) ) + 1;
    }


}


测试

public class BalancedBinaryTreeTest {

    public static void main(String[] args) {
        BalancedBinaryTree tree = new BalancedBinaryTree();
        int[] arr = {4,3,6,5,7,8};
        for (int i : arr) {
            tree.add(new Node(i));
        }

        tree.traverse();

        System.out.println("tree height: " + tree.getHeight(tree.root));
        System.out.println("左: " + tree.getHeight(tree.root.left));
        System.out.println("右: " + tree.getHeight(tree.root.right));
        System.out.println("左旋");
        tree.root.leftRotate();
        System.out.println("tree height: " + tree.getHeight(tree.root));
        System.out.println("左: " + tree.getHeight(tree.root.left));
        System.out.println("右: " + tree.getHeight(tree.root.right));
        tree.traverse();
    }

}
相关文章
|
6月前
|
Java
Java中如何构建平衡二叉树
Java中如何构建平衡二叉树
|
5月前
|
Java
JAVA中的AVL树实现
JAVA中的AVL树实现
59 1
|
5月前
|
Java
平衡二叉树(java)
平衡二叉树(java)
|
6月前
|
Java
AVL树(Java)
AVL树(Java)
86 0
|
6月前
|
Java
数据结构 AVL树概念以及实现插入的功能(含Java代码实现)
数据结构 AVL树概念以及实现插入的功能(含Java代码实现)
101 0
|
Java
数据结构(6)树形结构——平衡二叉树(JAVA代码实现)
6.1.概述 二叉搜索树存在一个问题,就是树的姿态和数据的插入顺序是有关系的,有时候树会变成某一边的子树高度过高,甚至直接退化成斜二叉树,使得查找从二分查找跌落为顺序查找:
138 0
|
算法 Java
Java数据结构与算法分析(九)AVL树(平衡二叉树)
AVL(Adelson-Velskii 和 Landis)树是带有平衡条件的二叉查找树,又叫做平衡二叉树。在AVL树中任何节点的两个子树高度差最多为1,所以它又被称为高度平衡树。
111 0
java202303java学习笔记第三十一天平衡二叉树4右右
java202303java学习笔记第三十一天平衡二叉树4右右
65 0
java202303java学习笔记第三十一天平衡二叉树3左左
java202303java学习笔记第三十一天平衡二叉树3左左
32 0
java202303java学习笔记第三十一天平衡二叉树5
java202303java学习笔记第三十一天平衡二叉树5
54 0