1. package com.rao.linkList;
  2.  
  3. /**
  4. * @author Srao
  5. * @className AvlTree
  6. * @date 2019/12/3 21:23
  7. * @package com.rao.linkList
  8. * @Description 二叉平衡树
  9. */
  10.  
  11. /**
  12. * 定义Avl树的节点
  13. */
  14. class AvlNode{
  15. int data;
  16. AvlNode lchild;//左孩子
  17. AvlNode rchild;//右孩子
  18. int height;//当前节点所在的高度
  19. }
  20.  
  21. /**
  22. * 定义平衡二叉树
  23. */
  24. public class AvlTree {
  25.  
  26. /**
  27. *
  28. * @param avlNode
  29. * @return 返回当前节点所在的高度
  30. */
  31. public int height(AvlNode avlNode){
  32. if (avlNode == null){
  33. return -1;
  34. }else {
  35. return avlNode.height;
  36. }
  37. }
  38.  
  39. /**
  40. * 左左型,进行右旋操作
  41. * @param K2:非平衡二叉树的根节点,以这个点进行旋转
  42. * @return
  43. */
  44. public AvlNode R_Rotate(AvlNode k2){
  45. AvlNode k1;
  46.  
  47. //进行旋转
  48. k1 = k2.lchild;
  49. k2.lchild = k1.rchild;
  50. k1.rchild = k2;
  51.  
  52. //重新计算高度,只有一个节点时的高度为0
  53. //原先根节点的高度
  54. k2.height = Math.max(height(k2.lchild), height(k2.rchild)) + 1;
  55. //新根节点的高度
  56. k1.height = Math.max(height(k1.rchild), height(k1.rchild)) + 1;
  57.  
  58. //返回新的根节点
  59. return k1;
  60. }
  61.  
  62. /**
  63. * 右右型,进行左旋操作
  64. * @param k2
  65. * @return
  66. */
  67. public AvlNode L_Rotate(AvlNode k2){
  68. AvlNode k1;
  69.  
  70. //进行旋转
  71. k1 = k2.rchild;
  72. k2.rchild = k1.lchild;
  73. k1.lchild = k2;
  74.  
  75. //重新计算高度
  76. //原先根节点的高度
  77. k2.height = Math.max(height(k2.lchild), height(k2.rchild)) + 1;
  78. //新根节点的高度
  79. k1.height = Math.max(height(k1.rchild), height(k1.rchild)) + 1;
  80.  
  81. //返回新的根节点
  82. return k1;
  83. }
  84.  
  85. /**
  86. * 左右型,先进行左旋,再进行右旋
  87. * @param k3 非平衡树的根节点
  88. * @return
  89. */
  90. public AvlNode L_R_Rotate(AvlNode k3){
  91. //先对其左孩子进行左旋
  92. k3.lchild = L_Rotate(k3.lchild);
  93.  
  94. //再进行整体右旋
  95. return R_Rotate(k3);
  96. }
  97.  
  98. /**
  99. * 右左型,先进行右旋,再进行左旋
  100. * @param k3
  101. * @return
  102. */
  103. public AvlNode R_L_Rotate(AvlNode k3){
  104. //先对其右孩子进行右旋
  105. k3.rchild = R_Rotate(k3.rchild);
  106.  
  107. //再整体左旋
  108. return L_Rotate(k3);
  109. }
  110.  
  111. /**
  112. * 向平衡二叉树中插入一个数
  113. * @param data:要插入的数
  114. * @param t:二叉树的根节点
  115. * @return 返回新的二叉树
  116. */
  117. public AvlNode insert(int data, AvlNode t){
  118. //如果二叉树已经没有根节点,那么这个数就成了一个新的二叉树
  119. if (t == null){
  120. t = new AvlNode();
  121. t.data = data;
  122. t.lchild = null;
  123. t.rchild = null;
  124. }else if (data < t.data){
  125. //向左孩子递归插入
  126. t.lchild = insert(data, t.lchild);
  127.  
  128. //进行调整,如果左孩子的高度比右孩子的高度大2
  129. if (height(t.lchild) - height(t.rchild) == 2){
  130. //左左型,右旋
  131. if (data < t.lchild.data){
  132. t = R_Rotate(t);
  133. }else {//左右型,先左旋,再右旋
  134. t = L_R_Rotate(t);
  135. }
  136. }
  137. }else if (t.data < data){
  138. //向右递归插入
  139. t.rchild = insert(data, t.rchild);
  140.  
  141. //进行调整,如果右孩子的高度比左孩子的高度大2
  142. if (height(t.rchild) - height(t.lchild) == 2){
  143. //右右型,左旋
  144. if (data > t.rchild.data){
  145. t = L_Rotate(t);
  146. }else {
  147. //右左型,先右旋,再左旋
  148. t = R_L_Rotate(t);
  149. }
  150. }
  151. }
  152.  
  153. //重新计算树的高度
  154. t.height = Math.max(height(t.lchild), height(t.rchild)) + 1;
  155. return t;
  156. }
  157.  
  158. }

只要记住每次旋转时都是从根节点开始旋转,理解起来还不算太难

平衡二叉树(Java)的更多相关文章

  1. 平衡二叉树 JAVA实现 亲测可用

    平衡二叉树的JAVA实现 亲测可用 包括LL LR RL RR四种情况的旋转算法 以及添加删除树结点之后对平衡二叉树的维护算法 都已经实现并测试过 没有问题. 代码地址可以直接上我的GIT clone ...

  2. 数据结构-平衡二叉树Java实现

    1,Node.java package com.cnblogs.mufasa.BalanceBinaryTree; public class Node { Node parent; Node left ...

  3. leetcode-110:判断平衡二叉树 Java

    Balanced Binary Tree Given a binary tree, determine if it is height-balanced. For this problem, a he ...

  4. 平衡二叉树--java

    package com.test.tree; /** * 带有平衡条件的二叉查找树 * */ public class AVLBinarySearchTree<T extends Compara ...

  5. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  6. Java实现平衡二叉树(AVLTree)的构建

    近期在学习数据结构上关于平衡二叉树的知识,看了严老师的思路,感觉用java写出递归的构建方式有点困难,由于当中的递归须要把引用传进去,所以感觉是要实现起来比較麻烦,所以就首先想到使用非递归的方式来实现 ...

  7. 平衡二叉树(AVL)java实现

    数的节点 package com.ydp.tree.AVLTree; public class Node{ private int data = 0; private Node lchild = nu ...

  8. 平衡二叉树的java实现

    转载请注明出处! 一.概念 平衡二叉树是一种特殊的二叉搜索树,关于二叉搜索树,请查看上一篇博客二叉搜索树的java实现,那它有什么特别的地方呢,了解二叉搜索树的基本都清楚,在按顺序向插入二叉搜索树中插 ...

  9. 【Java】 剑指offer(55-2) 平衡二叉树

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一棵二叉树的根结点,判断该树是不是平衡二叉树.如果某二叉树 ...

  10. 【Java】 大话数据结构(12) 查找算法(3) (平衡二叉树(AVL树))

    本文根据<大话数据结构>一书及网络资料,实现了Java版的平衡二叉树(AVL树). 平衡二叉树介绍 在上篇博客中所实现的二叉排序树(二叉搜索树),其查找性能取决于二叉排序树的形状,当二叉排 ...

随机推荐

  1. vue.js与element-ui实现菜单树形结构

    由于业务需要,要求实现树形菜单,且菜单数据由后台返回,在网上找了几篇文章,看下来总算有了解决办法.借鉴文章链接在最底部. 场景:根据业务要求,需要实现活动的树形菜单,菜单数据由后台返回,最后的效果图如 ...

  2. 如何通过 IntelliJ IDEA 来提升 Java8 Stream 的编码效率

    本文翻译整理自:https://winterbe.com/posts/2015/03/05/fixing-java-8-stream-gotchas-with-intellij-idea 作者:@Wi ...

  3. Linux下快速安装Python3和pip

    如果本机安装了python2,尽量不要管他,使用python3运行python脚本就好,因为可能有程序依赖目前的python2环境, 比如yum!!!!! 不要动现有的python2环境! 一.安装p ...

  4. 理解 Kubernetes 的亲和性调度

    这次给大家介绍下k8s的亲和性调度:nodeSelector.nodeAffinity.podAffinity.Taints以及Tolerations用法. 一般情况下我们部署的 POD 是通过集群自 ...

  5. HeRaNO's NOIP CSP Round Day 2 T2 PESTC

    对于我这种菜鸡来说还是挺有迷惑性的. 在考场发现答案问的是跟最值有关的数量,想到二分,结果果然具有单调性,考虑二份答案+验证 其实什么反转什么的,可以不用去管他,对于长度小于二分答案mid的道路,不去 ...

  6. 看年薪50W的架构师如何手写一个SpringMVC框架

    前言 做 Java Web 开发的你,一定听说过SpringMVC的大名,作为现在运用最广泛的Java框架,它到目前为止依然保持着强大的活力和广泛的用户群. 本文介绍如何用eclipse一步一步搭建S ...

  7. spring 请求参数和路径变量

    请求参数和路径变量:客户端传递参数给服务端的两种方式 请求参数可以发送值传递给服务器,请求参数采用key=value的形式并使用“&”符号进行参数间的分隔,例如: http://localho ...

  8. 【转载】C#中遍历DataTable中的数据行

    在C#中的Datatable数据变量的操作过程中,有时候我们需要遍历DataTable变量获取每一行的数据值,例如将DataTable变量转换为List集合的时候,我们就会遍历DataTable变量, ...

  9. Springboot jpa多数据源

    1.SpringBootApplication package com.xx.xxx; import org.springframework.beans.factory.annotation.Auto ...

  10. 025:为什么需要将Logger对象声明为private static final类型的

    本文阅读时间大约4分钟. 参考答案 就这个问题而言,我总结了三个原因: 设置为private是为了防止其他类使用当前类的日志对象: 设置为static是为了让每个类中的日志对象只生成一份,日志对象是属 ...