117.info
人生若只如初见

java怎么实现平衡二叉树

要实现平衡二叉树,可以使用红黑树或AVL树这样的自平衡二叉搜索树。
以下是使用AVL树实现平衡二叉树的示例代码:

// AVL树节点类
class Node {

    int val;

    int height;

    Node left;

    Node right;

    Node(int val) {

        this.val = val;

        this.height = 1;

    } } // 平衡二叉树类 class AVLTree {

    private Node root;

    // 获取节点的高度

    private int getHeight(Node node) {

        if (node == null) {

            return 0;

        }

        return node.height;

    }

    // 更新节点的高度

    private void updateHeight(Node node) {

        node.height = Math.max(getHeight(node.left), getHeight(node.right)) + 1;

    }

    // 获取节点的平衡因子

    private int getBalanceFactor(Node node) {

        if (node == null) {

            return 0;

        }

        return getHeight(node.left) - getHeight(node.right);

    }

    // 右旋操作

    private Node rightRotate(Node node) {

        Node newRoot = node.left;

        node.left = newRoot.right;

        newRoot.right = node;

        updateHeight(node);

        updateHeight(newRoot);

        return newRoot;

    }

    // 左旋操作

    private Node leftRotate(Node node) {

        Node newRoot = node.right;

        node.right = newRoot.left;

        newRoot.left = node;

        updateHeight(node);

        updateHeight(newRoot);

        return newRoot;

    }

    // 平衡节点

    private Node balance(Node node) {

        if (node == null) {

            return null;

        }

        updateHeight(node);

        int balanceFactor = getBalanceFactor(node);

        if (balanceFactor > 1) {

            if (getBalanceFactor(node.left) >= 0) {

                return rightRotate(node);

            } else {

                node.left = leftRotate(node.left);

                return rightRotate(node);

            }

        } else if (balanceFactor < -1) {

            if (getBalanceFactor(node.right) <= 0) {

                return leftRotate(node);

            } else {

                node.right = rightRotate(node.right);

                return leftRotate(node);

            }

        }

        return node;

    }

    // 插入节点

    public void insert(int val) {

        root = insert(root, val);

    }

    private Node insert(Node node, int val) {

        if (node == null) {

            return new Node(val);

        }

        if (val < node.val) {

            node.left = insert(node.left, val);

        } else if (val > node.val) {

            node.right = insert(node.right, val);

        } else {

            // 如果树中已经存在相同值的节点,则不进行插入

            return node;

        }

        return balance(node);

    }

    // 中序遍历

    public void inorderTraversal() {

        inorderTraversal(root);

    }

    private void inorderTraversal(Node node) {

        if (node == null) {

            return;

        }

        inorderTraversal(node.left);

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

        inorderTraversal(node.right);

    } } // 测试代码 public class Main {

    public static void main(String[] args) {

        AVLTree tree = new AVLTree();

        tree.insert(3);

        tree.insert(2);

        tree.insert(1);

        

        tree.inorderTraversal();  // 输出:1 2 3

    } }

以上是使用AVL树实现平衡二叉树的示例代码,其中包含了插入节点、平衡节点和中序遍历等操作。你可以根据需要进行修改和扩展。

未经允许不得转载 » 本文链接:https://www.117.info/ask/fef66AzsLAgJfB1U.html

推荐文章

  • java多个数字比较大小怎么实现

    可以通过比较运算符实现多个数字的大小比较。以下是一个示例代码:
    public class CompareNumbers { public static void main(String[] args) { int a = 5; ...

  • java中的arrays怎么使用

    在Java中,可以使用Arrays类来操作数组。下面是一些常用的Arrays类方法的使用示例: 使用sort方法对数组进行排序: int[] arr = {3, 1, 5, 2, 4};
    Arrays.s...

  • java如何修改set里的值

    在Java中,无法直接修改Set中的元素值,因为Set是一种不允许重复元素的集合,元素的值是不可变的。如果想要修改Set中的元素值,可以先将该元素从Set中删除,然后...

  • java怎么定义变量并赋值

    在Java中,可以使用以下方式来定义变量并赋值: 使用数据类型直接定义变量并赋值:
    int age = 18;
    String name = "John";
    double score = 85.5; ...

  • win10安装不上显卡驱动如何解决

    如果在Windows 10上安装显卡驱动程序遇到问题,您可以尝试以下解决方法:1. 使用官方驱动程序:确保您下载和安装的是官方显卡驱动程序,可以从显卡厂商的官方网站...

  • win10更新后变卡了如何恢复

    如果您的Windows 10更新后变得卡顿,可以尝试以下几种方法来恢复系统速度: 清理磁盘空间:打开文件资源管理器,右键点击系统驱动器(通常为C盘),选择“属性”...

  • vb中怎么让文字滚动

    在VB中,可以使用Label控件来实现文字滚动效果。下面是一个示例代码: 在窗体上放置一个Label控件,并将其命名为lblScroll。
    设置Label控件的AutoSize属性为...

  • dubbo泛化调用的原理是什么

    Dubbo泛化调用是一种通过接口的方式来调用远程服务的方式,它的原理是通过序列化和反序列化技术,将接口的方法名、参数类型和参数值等信息进行序列化,然后通过网...