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中异常类会影响性能吗

    在Java中,异常类本身不会对性能产生显著影响。异常处理机制是为了在程序运行时处理错误或异常情况,而不是为了优化性能。然而,在使用异常时,需要注意以下几点...

  • java中异常类如何避免

    在Java中,避免异常的最好方法是编写健壮的代码并遵循一些最佳实践。以下是一些建议: 预期和处理异常:使用try-catch语句来捕获和处理可能发生的异常。确保处理...

  • java中异常类有哪些常见类型

    Java中的异常类主要分为两大类:受检异常(Checked Exceptions)和非受检异常(Unchecked Exceptions)。以下是具体的异常类型:
    受检异常(Checked Except...

  • java中异常类怎么捕获

    在Java中,我们使用try-catch语句来捕获异常。当程序执行过程中遇到异常时,Java运行时系统会抛出一个异常对象。你可以使用try块来包含可能引发异常的代码,然后...

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

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

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

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

  • vb中怎么让文字滚动

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

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

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