返回顶部
首页 > 资讯 > 精选 >Java平衡二叉树实例分析
  • 114
分享到

Java平衡二叉树实例分析

2023-06-30 18:06:47 114人浏览 独家记忆
摘要

这篇文章主要讲解了“Java平衡二叉树实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java平衡二叉树实例分析”吧!AVL树的引入搜索二叉树有着极高的搜索效率,但是搜索二叉树会出现以

这篇文章主要讲解了“Java平衡二叉树实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java平衡二叉树实例分析”吧!

AVL树的引入

搜索二叉树有着极高的搜索效率,但是搜索二叉树会出现以下极端情况:

Java平衡二叉树实例分析

这样的二叉树搜索效率甚至比链表还低。在搜索二叉树基础上出现的平衡二叉树(AVL树)就解决了这样的问题。当平衡二叉树(AVL树)的某个节点左右子树高度差的绝对值大于1时,就会通过旋转操作减小它们的高度差。

基本概念

AVL树本质上还是一棵二叉搜索树,它的特点是:

  • 本身首先是一棵二叉搜索树。

  • 每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。也就是说,AVL树,本质上是带了平衡功能的二叉查找树(二叉排序树,二叉搜索树)。

  • 当插入一个节点或者删除一个节点时,导致某一个节点的左右子树高度差的绝对值大于1,这时需要通过左旋和右旋的操作使二叉树再次达到平衡状态。

平衡因子(balanceFactor)

  • 一个结点的左子树与右子树的高度之差。

  • AVL树中的任意结点的BF只可能是-1,0和1。

基础设计

下面是AVL树需要的简单方法和属性:

public class AVLTree <E extends Comparable<E>>{    class node{        E value;        Node left;        Node right;        int height;        public Node(){}        public Node(E value){            this.value = value;            height = 1;            left = null;            right = null;        }        public void display(){            System.out.print(this.value + " ");        }    }    Node root;    int size;    public int size(){        return size;    }    public int getHeight(Node node) {        if(node == null) return 0;        return node.height;    }    //获取平衡因子(左右子树的高度差,大小为1或者0是平衡的,大小大于1不平衡)    public int getBalanceFactor(){        return getBalanceFactor(root);    }    public int getBalanceFactor(Node node){        if(node == null) return 0;        return getHeight(node.left) - getHeight(node.right);    }    //判断一个树是否是一个平衡二叉树    public boolean isBalance(Node node){        if(node == null) return true;        int balanceFactor = Math.abs(getBalanceFactor(node.left) - getBalanceFactor(node.right));        if(balanceFactor > 1) return false;        return isBalance(node.left) && isBalance(node.right);    }    public boolean isBalance(){        return isBalance(root);    }    //中序遍历树    private  void inPrevOrder(Node root){        if(root == null) return;        inPrevOrder(root.left);        root.display();        inPrevOrder(root.right);    }    public void inPrevOrder(){        System.out.print("中序遍历:");        inPrevOrder(root);    }}

RR(左旋)

往一个树右子树的右子树上插入一个节点,导致二叉树变得不在平衡,如下图,往平衡二叉树中插入5,导致这个树变得不再平衡,此时需要左旋操作,如下:

Java平衡二叉树实例分析

代码如下:

//左旋,并且返回新的根节点    public Node leftRotate(Node node){        System.out.println("leftRotate");       Node cur = node.right;       node.right = cur.left;       cur.left = node;       //跟新node和cur的高度        node.height = Math.max(getHeight(node.left),getHeight(node.right)) + 1;        cur.height = Math.max(getHeight(cur.left),getHeight(cur.right)) + 1;        return cur;    }

LL(右旋)

往一个AVL树左子树的左子树上插入一个节点,导致二叉树变得不在平衡,如下图,往平衡二叉树中插入2,导致这个树变得不再平衡,此时需要左旋操作,如下:

Java平衡二叉树实例分析

代码如下:

 //右旋,并且返回新的根节点    public Node rightRotate(Node node){        System.out.println("rightRotate");        Node cur = node.left;        node.left = cur.right;        cur.right = node;        //跟新node和cur的高度        node.height = Math.max(getHeight(node.left),getHeight(node.right)) + 1;        cur.height = Math.max(getHeight(cur.left),getHeight(cur.right)) + 1;        return cur;    }

LR(先左旋再右旋)

往AVL树左子树的右子树上插入一个节点,导致该树不再平衡,需要先对左子树进行左旋,再对整棵树右旋,如下图所示,插入节点为5.

Java平衡二叉树实例分析

RL(先右旋再左旋)

往AVL树右子树的左子树上插入一个节点,导致该树不再平衡,需要先对右子树进行右旋,再对整棵树左旋,如下图所示,插入节点为2.

Java平衡二叉树实例分析

添加节点

//添加元素    public  void add(E e){        root = add(root,e);    }    public Node add(Node node, E value) {        if (node == null) {            size++;            return new Node(value);        }        if (value.compareTo(node.value) > 0) {            node.right = add(node.right, value);        } else if (value.compareTo(node.value) < 0) {            node.left = add(node.left, value);        }        //跟新节点高度        node.height = Math.max(getHeight(node.left), getHeight(node.right)) + 1;        //获取当前节点的平衡因子        int balanceFactor = getBalanceFactor(node);        //该子树不平衡且新插入节点(导致不平衡的节点)在左子树的左子树上,此时需要进行右旋        if (balanceFactor > 1 && getBalanceFactor(node.left) >= 0) {            return rightRotate(node);        }        //该子树不平衡且新插入节点(导致不平衡的节点)在右子树子树的右子树上,此时需要进行左旋        else if (balanceFactor < -1 && getBalanceFactor(node.right) <= 0) {            return leftRotate(node);        }        //该子树不平衡且新插入节点(导致不平衡的节点)在左子树的右子树上,此时需要先对左子树左旋,在整个树右旋        else if (balanceFactor > 1 && getBalanceFactor(node.left) < 0) {            node.left = leftRotate(node.left);            return rightRotate(node);        }        //balanceFactor < -1 && getBalanceFactor(node.left) > 0        //该子树不平衡且新插入节点(导致不平衡的节点)在右子树的左子树上,此时需要先对右子树右旋,再整个树左旋        else if(balanceFactor < -1 && getBalanceFactor(node.right) > 0) {            node.right = rightRotate(node.right);            return leftRotate(node);        }        return node;    }

删除节点

 //删除节点    public E remove(E value){        root = remove(root,value);        if(root == null){            return null;        }        return root.value;    }    public Node remove(Node node, E value){        Node retNode = null;        if(node == null)            return retNode;        if(value.compareTo(node.value) > 0){            node.right = remove(node.right,value);            retNode = node;        }        else if(value.compareTo(node.value) < 0){            node.left = remove(node.left,value);            retNode = node;        }        //value.compareTo(node.value) = 0        else{            //左右节点都为空,或者左节点为空            if(node.left == null){                size--;                retNode = node.right;            }            //右节点为空            else if(node.right == null){                size--;                retNode = node.left;            }            //左右节点都不为空            else{                Node successor = new Node();                //寻找右子树最小的节点                Node cur = node.right;                while(cur.left != null){                    cur = cur.left;                }                successor.value  = cur.value;                successor.right = remove(node.right,value);                successor.left = node.left;                node.left =  node.right = null;                retNode = successor;            }            if(retNode == null)                return null;            //维护二叉树平衡            //跟新height            retNode.height = Math.max(getHeight(retNode.left),getHeight(retNode.right));        }        int balanceFactor = getBalanceFactor(retNode);        //该子树不平衡且新插入节点(导致不平衡的节点)在左子树的左子树上,此时需要进行右旋        if (balanceFactor > 1 && getBalanceFactor(retNode.left) >= 0) {            return rightRotate(retNode);        }        //该子树不平衡且新插入节点(导致不平衡的节点)在右子树子树的右子树上,此时需要进行左旋        else if (balanceFactor < -1 && getBalanceFactor(retNode.right) <= 0) {            return leftRotate(retNode);        }        //该子树不平衡且新插入节点(导致不平衡的节点)在左子树的右子树上,此时需要先对左子树左旋,在整个树右旋        else if (balanceFactor > 1 && getBalanceFactor(retNode.left) < 0) {            retNode.left = leftRotate(retNode.left);            return rightRotate(retNode);        }        //该子树不平衡且新插入节点(导致不平衡的节点)在右子树的左子树上,此时需要先对右子树右旋,再整个树左旋        else if(balanceFactor < -1 && getBalanceFactor(retNode.right) > 0) {            retNode.right = rightRotate(retNode.right);            return leftRotate(retNode);        }        return  retNode;    }

感谢各位的阅读,以上就是“Java平衡二叉树实例分析”的内容了,经过本文的学习后,相信大家对Java平衡二叉树实例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Java平衡二叉树实例分析

本文链接: https://lsjlt.com/news/330815.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java平衡二叉树实例分析
    这篇文章主要讲解了“Java平衡二叉树实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java平衡二叉树实例分析”吧!AVL树的引入搜索二叉树有着极高的搜索效率,但是搜索二叉树会出现以...
    99+
    2023-06-30
  • Java深入分析了解平衡二叉树
    目录AVL树的引入基本概念基础设计RR(左旋)LL(右旋)LR(先左旋再右旋)RL(先右旋再左旋)添加节点删除节点AVL树的引入 搜索二叉树有着极高的搜索效率,但是搜索二叉树会出现以...
    99+
    2024-04-02
  • C语言平衡二叉树的示例分析
    这篇文章给大家分享的是有关C语言平衡二叉树的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一...
    99+
    2023-06-25
  • Java如何实现平衡二叉树
    小编给大家分享一下Java如何实现平衡二叉树,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1 平衡二叉树的概述为了避免极端情况下二叉搜索树退化为链表,影响查找效率...
    99+
    2023-06-28
  • Java平衡二叉树怎么实现
    本篇内容主要讲解“Java平衡二叉树怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java平衡二叉树怎么实现”吧!什么是二叉搜索树简单来说,就是方便搜索的二叉树,是一种具备特定结构的二叉...
    99+
    2023-06-29
  • Java源码解析之平衡二叉树
    目录一、平衡二叉树的定义二、平衡二叉树的实现原理三、最终结果一、平衡二叉树的定义 平衡二叉树是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1 。它是一种高度平衡的二...
    99+
    2024-04-02
  • Python实现二叉排序树与平衡二叉树的示例代码
    目录前言1. 二叉排序树1.1 构建一棵二叉排序树1.2 二叉排序树的数据结构1.3 实现二叉排序树类中的方法:2. 平衡二叉排序树2.1 二叉平衡排序树的数据结构3. 总结前言 什...
    99+
    2024-04-02
  • Python树表查找(二叉排序树、平衡二叉树)
    目录什么是树表查询?1. 二叉排序树1.1 构建一棵二叉排序树1.2 二叉排序树的数据结构1.3 实现二叉排序树类中的方法:3. 平衡二叉排序树3.1 二叉平衡排序树的数据结构4. ...
    99+
    2023-01-07
    python建立二叉排序树 二叉排序树python实现 python实现平衡二叉树遍历
  • C++实现LeetCode(110.平衡二叉树)
    [LeetCode] 110.Balanced Binary Tree 平衡二叉树 Given a binary tree, determine if it is height-ba...
    99+
    2024-04-02
  • C++怎么实现平衡二叉树
    本篇内容介绍了“C++怎么实现平衡二叉树”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!平衡二叉树Given a binary tree, d...
    99+
    2023-06-20
  • 如何使用Java的平衡二叉树
    这篇文章主要讲解了“如何使用Java的平衡二叉树”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用Java的平衡二叉树”吧!二叉排序树可能的问题给定一个数列{1,2,3,4,5,6},要...
    99+
    2023-06-15
  • C++树与二叉树实例分析
    这篇“C++树与二叉树实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++树与二叉树实例分析”文章吧。树树的定义Q:...
    99+
    2023-06-30
  • Java中二叉树与N叉树的示例分析
    这篇文章主要介绍了Java中二叉树与N叉树的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。题目一 解法class Solution {&...
    99+
    2023-06-29
  • Java实现红黑树(平衡二叉树)的详细过程
    目录前言红黑二叉查找树2-3树2-3树的插入操作实现红黑二叉树结尾前言 在实现红黑树之前,我们先来了解一下符号表。 符号表的描述借鉴了Algorithms第四版,详情在:https...
    99+
    2024-04-02
  • 什么是平衡二叉树AVL
    什么是平衡二叉树AVL,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前言Wiki:在计算机科学中,AVL树是最早被发明的自平衡二叉查找树。在AVL树中,任一节点...
    99+
    2023-06-04
  • java二叉搜索树使用实例分析
    本篇内容主要讲解“java二叉搜索树使用实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java二叉搜索树使用实例分析”吧!概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性...
    99+
    2023-06-29
  • C++AVLTree高度平衡的二叉搜索树深入分析
    目录一、AVL树的概念二、AVL树节点的定义三、AVL树的插入四、AVL树的旋转1.左单旋2.右单旋3.左右双旋4.右左双旋五、进行验证六、AVLTree的性能一、AVL树的概念 二...
    99+
    2023-03-08
    C++ AVLTree二叉搜索树 C++高度平衡二叉搜索树
  • C语言平衡二叉树详解
    目录调整措施:一、单旋转二、双旋转AVL树的删除操作:删除分为以下几种情况:1.要删除的节点是当前根节点T。2、要删除的节点元素值小于当前根节点T值,在左子树中进行删除。3、要删除的...
    99+
    2024-04-02
  • 详解Java数据结构之平衡二叉树
    目录什么是二叉搜索树平衡二叉搜索树平衡二叉搜索树建树程序计算每个节点的高度计算每个节点的平衡因子合并二叉树旋转调整函数整体代码什么是二叉搜索树 简单来说,就是方便搜索的二叉树,是一种...
    99+
    2024-04-02
  • Java中平衡二叉树的原理是什么
    Java中平衡二叉树的原理是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、平衡二叉树的定义平衡二叉树是一种二叉排序树,其中每一个节点的左子树和右子树的高...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作