图解

代码实现

package com.atguigu.avl;
/*** @创建人 wdl* @创建时间 2021/3/30* @描述*/
public class AVLTreeDemo {public static void main(String[] args) {//        int[] arr={4,3,6,5,7,8};//创建一个AVLTree对象
//        int arr[]={10,12,8,9,7,6};int[] arr={10,11,7,6,8,9};AVLTree avlTree = new AVLTree();//添加for (int i = 0; i < arr.length; i++) {avlTree.add(new Node(arr[i]));}//遍历System.out.println("中序遍历");avlTree.infixOrder();System.out.println("在平衡处理后");System.out.println(avlTree.getRoot().height());System.out.println(avlTree.getRoot().leftHeight());System.out.println(avlTree.getRoot().rightHeight());System.out.println("当前的根节点"+avlTree.getRoot());}
}//创建AVLTree
class AVLTree{private Node root;public Node getRoot() {return root;}//查找要 删除的节点public Node search(int value){if (root==null){return null;}else {return root.search(value);}}//查找父节点public Node searchParent(int value){if (root==null){return null;}else {return root.searchParent(value);}}//编写方法//1.返回的是以node为根节点的二叉排序树的最小节点的值//2.删除以node为根节点的二叉排序树的最小节点/**** @param node 传入的节点(当做一颗二叉排序树的根节点)* @return 返回的是以node为根节点的二叉排序树的最小节点的值*/public int delRightTreeMin(Node node){Node target=node;//循环的查找左节点,就会找到最小值while (target.left!=null){target=target.left;}//这时target就指向了最小节点//删除最小节点delNode(target.value);return target.value;}//删除节点public void delNode(int value){if(root==null){return;}else {//1.需求先找到要删除节点targetNodeNode targetNode = search(value);//如果没有找到要删除的节点if(targetNode==null){return;}//如果我们发现targetNode没有父节点//如果们发现当前这颗二叉排序树只有一个节点if (root.left==null&&root.right==null){root=null;return;}//去找到targetNode的父节点Node parent = searchParent(value);//如果要删除的节点是叶子节点if(targetNode.left==null&&targetNode.right==null){//判断targetNode是父节点的左子节点,还是右子节点if (parent.left!=null&&parent.left.value==value){//是左子节点parent.left=null;}else if (parent.right!=null&&parent.right.value==value){//是右子节点parent.right=null;}}else if(targetNode.left!=null&&targetNode.right!=null){//删除有两颗子树的节点int minVal=delRightTreeMin(targetNode.right);targetNode.value=minVal;}else {//删除只有一颗子树的节点//如果要要删除的节点有左子节点if (targetNode.left!=null){if(parent!=null){if (parent.left.value==value){//是左子节点parent.left=targetNode.left;}else{//是右子节点parent.right=targetNode.left;}}else {root=targetNode.left;}}else{ //如果要要删除的节点有右子节点if (parent!=null){if (parent.left.value==value){//是左子节点parent.left=targetNode.right;}else{//是右子节点parent.right=targetNode.right;}}else {root=targetNode.right;}}}}}//添加节点的方法public void add(Node node){if(root==null){root=node;//如果root为空直接让root指向node}else {root.add(node);}}//中序遍历public void infixOrder(){if(root!=null){root.infixOrder();}else {System.out.println("二叉排序树为空,不能遍历");}}}//创建Node节点
class Node{int value;Node left;Node right;public Node(int value) {this.value = value;}//返回左子树的高度public int leftHeight(){if(left==null){return 0;}return left.height();}//返回右子树的高度public int rightHeight(){if(right==null){return 0;}return right.height();}//返回当前节点的高度,以该节点为根节点的树的高度public int height(){return Math.max(left==null?0:left.height(),right==null?0:right.height())+1;}//左旋转方法private void leftRotate(){//创建新的节点,以当前根节点的值Node newNode = new Node(value);//把新的节点的左子树设置成当前节点的左子树newNode.left=left;//把新的节点的右子树设置成当前节点的右子树的左子树newNode.right=right.left;//把当前节点的值替换成右子节点的值value=right.value;//把当前节点的右子树设置成右子树的右子树right=right.right;//把当前节点的左子树(左子节点)设置成新的节点left=newNode;}//右旋转private void rightRotate(){Node newNode = new Node(value);newNode.right=right;newNode.left=left.right;value=left.value;left=left.left;right=newNode;}//查找要删除的节点/**** @param value 希望删除的节点的值* @return 如果找到返回该节点,否则返回null*/public Node search(int value){if(value==this.value){//找到就是该节点return this;}else if (value<this.value){//如果查找的值小于当前节点,向左子树递归查找//如果左子节点为空if(this.left==null){return null;}return this.left.search(value);}else {//如果查找的值不小于当前节点,向右子树递归查找//如果右子节点为空if(this.right==null){return null;}return this.right.search(value);}}//查找要删除节点的父节点/**** @param value 要找到的节点的值* @return 返回的是要删除节点的父节点,如果没有就返回null*/public Node searchParent(int value){//如果当前节点就是要删除的节点的父节点,就返回if((this.left!=null&&this.left.value==value)||(this.right!=null&&this.right.value==value)){return  this;}else {//如果查找的值小于当前节点的值,并且当前节点的左子节点不为空if(value<this.value&&this.left!=null){return this.left.searchParent(value);//向左子树递归查找}else if(value>=this.value&&this.right!=null){return this.right.searchParent(value);//向右子树递归查找}else {return null;//没有找到父节点}}}@Overridepublic String toString() {return "Node{" +"value=" + value +'}';}//添加节点的方法//递归的形式添加节点,注意需要二叉排序树的要求public void add(Node node){if(node==null){return;}//判断传入节点的值,和当前子树的根节点的值得关系if(node.value<this.value){//如果当前节点的左子节点为nullif(this.left==null){this.left=node;}else {//递归的向左子树添加this.left.add(node);}}else {//添加的节点的值大于当前节点的值//如果当前节点的左子节点为nullif(this.right==null){this.right=node;}else {//递归的向右子树添加this.right.add(node);}}//当添加完一个节点后,如果(右子树的高度-左子树的高度)>1,左旋转if (rightHeight()-leftHeight()>1){//如果它的右子树的左子树的高度大于它的右子树的告诉if(right!=null&&right.leftHeight()>right.rightHeight()){//先对当前节点的右节点(右子树)->右旋转right.rightRotate();//再对当前节点进行左旋转leftRotate();}else {//直接进行左旋转即可leftRotate();}return;//必须要!!!}//当添加完一个节点后,如果(左子树的高度-右子树的高度)>1,右旋转if (leftHeight()-rightHeight()>1){//如果它的左子树的右子树的高度大于它的左子树的告诉if(left!=null&&left.rightHeight()>left.leftHeight()){//先对当前节点的左节点(左子树)->左旋转left.leftRotate();//再对当前节点进行右旋转rightRotate();}else {//直接进行右旋转即可rightRotate();}}}//中序遍历public void infixOrder(){if(this.left!=null){this.left.infixOrder();}System.out.println(this);if (this.right!=null){this.right.infixOrder();}}}

AVL树双旋转+图解相关推荐

  1. AVL树平衡旋转详解

    AVL树平衡旋转详解 概述 AVL树又叫做平衡二叉树.前言部分我也有说到,AVL树的前提是二叉排序树(BST或叫做二叉查找树).由于在生成BST树的过程中可能会出现线型树结构,比如插入的顺序是:1, ...

  2. c++《AVL树的概念》《AVL树的插入》《AVL树的旋转》《AVL树的验证》《AVL树的删除》《AVL树的性能》

    4.1 AVL树 4.1.1 AVL树的概念 二叉搜索树虽可以缩短查找的效率,**但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当 于在顺序表中搜索元素,效率低下.**因此,两位俄罗斯的 ...

  3. 实现平衡二叉树(AVL树)的旋转

    给你一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在. 左边 BST 存在的问题分析:               1) 左子树全部为空,从形式上看,更像一个单链 ...

  4. 树的四种遍历案例和AVL树的旋转的四种情况

    树与二叉树 一, 树的基本术语 树中一个结点的子结点个数称为该结点的度, 树中结点的最大度数称为树的度.如结点B的度为2,结点D的度为3,树的度为3. 度大于0的结点称为分支结点(又称非终端结点),度 ...

  5. 数据结构-----AVL树的旋转操作

    本文主要讲解AVL的旋转操作,供自己复习用,如有不对之处请指出.另外图片是从链接处的大神那复制的,感觉文章写的很好,可以去学习. http://www.cnblogs.com/QG-whz/p/516 ...

  6. 平衡二叉树之AVL树的旋转

    平衡二叉树是基于二叉排序树(或者也叫二叉搜索树)实现的一种自平衡的二叉树,实现方法有比如:AVL树.红黑树等等 二叉搜索树定义(维基百科): 二叉查找树(英语:Binary Search Tree), ...

  7. AVL树的旋转与插入(C语言)

    代码如下: typedef struct AVLNode *Position; typedef Position AVLTree; /* AVL树类型 */ struct AVLNode{Elemen ...

  8. avl删除根节点图解_图解 6 种树,你心中有数吗。。。

    数据结构这门课程是计算机相关专业的基础课,数据结构指的是数据在计算机中的存储.组织方式. 我们在学习数据结构时候,会遇到各种各样的基础数据结构,比如堆栈.队列.数组.链表.树...这些基本的数据结构类 ...

  9. b+树时间复杂度_图解:计算机数据结构中的 6 种「树」,你心中有数了吗?

    数据结构这门课程是计算机相关专业的基础课,数据结构指的是数据在计算机中的存储.组织方式. 我们在学习数据结构时候,会遇到各种各样的基础数据结构,比如堆栈.队列.数组.链表.树...这些基本的数据结构类 ...

最新文章

  1. db2不记录日志插入记录
  2. WaitForMultipleObjects用法详解,一看就懂
  3. 1.5 字符串大小写转换(toLowerCase()和toUpperCase())
  4. 教你如何用 lib-flexible 实现移动端H5页面适配
  5. mysql查看线程详解(转载)
  6. matlab 登录界面设计,【MATLAB】 浅析登录界面设计
  7. paip.提升用户体验---c++ QPushButton按钮控件透明以及不规则按钮以及 鼠标越过动态设置
  8. 小米wifi linux 客户端下载,小米无线wifi安装_小米无线wifi客户端下载[最新版]-下载之家...
  9. python技术文档的阅读理解
  10. 五笔86和汉字对照表
  11. 《计算机网络(第7版)-谢希仁》期末复习
  12. 一键禁用windows defender
  13. 读论文,第十六天:FrownOnError: Interrupting Responses from Smart Speakers by Facial Expressions
  14. 京东云 linux无法远程,问题解读 | Linux系统SSH无法远程登录时该怎么办?这里有篇小攻...
  15. sklearn 纠偏
  16. 生物学中的云计算和大数据
  17. 智能锁忘记密码怎么办
  18. 物联网卡就是不能打电话的电话卡?
  19. 一个64位操作系统的实现
  20. Tecnomatix Plant Simulation 2201

热门文章

  1. Java8新特性解析
  2. Codefest 18 (rated, Div. 1 + Div. 2)-D-Valid BFS--思维--已知bfs序,求是否正确
  3. AcWing 1402. 星空之夜 1月28
  4. [SCOI2015]小凸玩矩阵 (匈牙利+二分)
  5. P4570-[BJWC2011]元素【线性基,贪心】
  6. 欢乐纪中A组周六赛【2019.3.30】
  7. P2468-[SDOI2010]粟粟的书架【主席树,二维前缀和】
  8. P1063-能量项链【区间dp】
  9. 2021牛客暑期多校训练营6 J-Defend Your Country(无向图点双+思维)
  10. 【状压DP】最优配对问题(jzoj 3420)