平衡二叉树(Java)
- package com.rao.linkList;
- /**
- * @author Srao
- * @className AvlTree
- * @date 2019/12/3 21:23
- * @package com.rao.linkList
- * @Description 二叉平衡树
- */
- /**
- * 定义Avl树的节点
- */
- class AvlNode{
- int data;
- AvlNode lchild;//左孩子
- AvlNode rchild;//右孩子
- int height;//当前节点所在的高度
- }
- /**
- * 定义平衡二叉树
- */
- public class AvlTree {
- /**
- *
- * @param avlNode
- * @return 返回当前节点所在的高度
- */
- public int height(AvlNode avlNode){
- if (avlNode == null){
- return -1;
- }else {
- return avlNode.height;
- }
- }
- /**
- * 左左型,进行右旋操作
- * @param K2:非平衡二叉树的根节点,以这个点进行旋转
- * @return
- */
- public AvlNode R_Rotate(AvlNode k2){
- AvlNode k1;
- //进行旋转
- k1 = k2.lchild;
- k2.lchild = k1.rchild;
- k1.rchild = k2;
- //重新计算高度,只有一个节点时的高度为0
- //原先根节点的高度
- k2.height = Math.max(height(k2.lchild), height(k2.rchild)) + 1;
- //新根节点的高度
- k1.height = Math.max(height(k1.rchild), height(k1.rchild)) + 1;
- //返回新的根节点
- return k1;
- }
- /**
- * 右右型,进行左旋操作
- * @param k2
- * @return
- */
- public AvlNode L_Rotate(AvlNode k2){
- AvlNode k1;
- //进行旋转
- k1 = k2.rchild;
- k2.rchild = k1.lchild;
- k1.lchild = k2;
- //重新计算高度
- //原先根节点的高度
- k2.height = Math.max(height(k2.lchild), height(k2.rchild)) + 1;
- //新根节点的高度
- k1.height = Math.max(height(k1.rchild), height(k1.rchild)) + 1;
- //返回新的根节点
- return k1;
- }
- /**
- * 左右型,先进行左旋,再进行右旋
- * @param k3 非平衡树的根节点
- * @return
- */
- public AvlNode L_R_Rotate(AvlNode k3){
- //先对其左孩子进行左旋
- k3.lchild = L_Rotate(k3.lchild);
- //再进行整体右旋
- return R_Rotate(k3);
- }
- /**
- * 右左型,先进行右旋,再进行左旋
- * @param k3
- * @return
- */
- public AvlNode R_L_Rotate(AvlNode k3){
- //先对其右孩子进行右旋
- k3.rchild = R_Rotate(k3.rchild);
- //再整体左旋
- return L_Rotate(k3);
- }
- /**
- * 向平衡二叉树中插入一个数
- * @param data:要插入的数
- * @param t:二叉树的根节点
- * @return 返回新的二叉树
- */
- public AvlNode insert(int data, AvlNode t){
- //如果二叉树已经没有根节点,那么这个数就成了一个新的二叉树
- if (t == null){
- t = new AvlNode();
- t.data = data;
- t.lchild = null;
- t.rchild = null;
- }else if (data < t.data){
- //向左孩子递归插入
- t.lchild = insert(data, t.lchild);
- //进行调整,如果左孩子的高度比右孩子的高度大2
- if (height(t.lchild) - height(t.rchild) == 2){
- //左左型,右旋
- if (data < t.lchild.data){
- t = R_Rotate(t);
- }else {//左右型,先左旋,再右旋
- t = L_R_Rotate(t);
- }
- }
- }else if (t.data < data){
- //向右递归插入
- t.rchild = insert(data, t.rchild);
- //进行调整,如果右孩子的高度比左孩子的高度大2
- if (height(t.rchild) - height(t.lchild) == 2){
- //右右型,左旋
- if (data > t.rchild.data){
- t = L_Rotate(t);
- }else {
- //右左型,先右旋,再左旋
- t = R_L_Rotate(t);
- }
- }
- }
- //重新计算树的高度
- t.height = Math.max(height(t.lchild), height(t.rchild)) + 1;
- return t;
- }
- }
只要记住每次旋转时都是从根节点开始旋转,理解起来还不算太难
平衡二叉树(Java)的更多相关文章
- 平衡二叉树 JAVA实现 亲测可用
平衡二叉树的JAVA实现 亲测可用 包括LL LR RL RR四种情况的旋转算法 以及添加删除树结点之后对平衡二叉树的维护算法 都已经实现并测试过 没有问题. 代码地址可以直接上我的GIT clone ...
- 数据结构-平衡二叉树Java实现
1,Node.java package com.cnblogs.mufasa.BalanceBinaryTree; public class Node { Node parent; Node left ...
- leetcode-110:判断平衡二叉树 Java
Balanced Binary Tree Given a binary tree, determine if it is height-balanced. For this problem, a he ...
- 平衡二叉树--java
package com.test.tree; /** * 带有平衡条件的二叉查找树 * */ public class AVLBinarySearchTree<T extends Compara ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- Java实现平衡二叉树(AVLTree)的构建
近期在学习数据结构上关于平衡二叉树的知识,看了严老师的思路,感觉用java写出递归的构建方式有点困难,由于当中的递归须要把引用传进去,所以感觉是要实现起来比較麻烦,所以就首先想到使用非递归的方式来实现 ...
- 平衡二叉树(AVL)java实现
数的节点 package com.ydp.tree.AVLTree; public class Node{ private int data = 0; private Node lchild = nu ...
- 平衡二叉树的java实现
转载请注明出处! 一.概念 平衡二叉树是一种特殊的二叉搜索树,关于二叉搜索树,请查看上一篇博客二叉搜索树的java实现,那它有什么特别的地方呢,了解二叉搜索树的基本都清楚,在按顺序向插入二叉搜索树中插 ...
- 【Java】 剑指offer(55-2) 平衡二叉树
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一棵二叉树的根结点,判断该树是不是平衡二叉树.如果某二叉树 ...
- 【Java】 大话数据结构(12) 查找算法(3) (平衡二叉树(AVL树))
本文根据<大话数据结构>一书及网络资料,实现了Java版的平衡二叉树(AVL树). 平衡二叉树介绍 在上篇博客中所实现的二叉排序树(二叉搜索树),其查找性能取决于二叉排序树的形状,当二叉排 ...
随机推荐
- vue.js与element-ui实现菜单树形结构
由于业务需要,要求实现树形菜单,且菜单数据由后台返回,在网上找了几篇文章,看下来总算有了解决办法.借鉴文章链接在最底部. 场景:根据业务要求,需要实现活动的树形菜单,菜单数据由后台返回,最后的效果图如 ...
- 如何通过 IntelliJ IDEA 来提升 Java8 Stream 的编码效率
本文翻译整理自:https://winterbe.com/posts/2015/03/05/fixing-java-8-stream-gotchas-with-intellij-idea 作者:@Wi ...
- Linux下快速安装Python3和pip
如果本机安装了python2,尽量不要管他,使用python3运行python脚本就好,因为可能有程序依赖目前的python2环境, 比如yum!!!!! 不要动现有的python2环境! 一.安装p ...
- 理解 Kubernetes 的亲和性调度
这次给大家介绍下k8s的亲和性调度:nodeSelector.nodeAffinity.podAffinity.Taints以及Tolerations用法. 一般情况下我们部署的 POD 是通过集群自 ...
- HeRaNO's NOIP CSP Round Day 2 T2 PESTC
对于我这种菜鸡来说还是挺有迷惑性的. 在考场发现答案问的是跟最值有关的数量,想到二分,结果果然具有单调性,考虑二份答案+验证 其实什么反转什么的,可以不用去管他,对于长度小于二分答案mid的道路,不去 ...
- 看年薪50W的架构师如何手写一个SpringMVC框架
前言 做 Java Web 开发的你,一定听说过SpringMVC的大名,作为现在运用最广泛的Java框架,它到目前为止依然保持着强大的活力和广泛的用户群. 本文介绍如何用eclipse一步一步搭建S ...
- spring 请求参数和路径变量
请求参数和路径变量:客户端传递参数给服务端的两种方式 请求参数可以发送值传递给服务器,请求参数采用key=value的形式并使用“&”符号进行参数间的分隔,例如: http://localho ...
- 【转载】C#中遍历DataTable中的数据行
在C#中的Datatable数据变量的操作过程中,有时候我们需要遍历DataTable变量获取每一行的数据值,例如将DataTable变量转换为List集合的时候,我们就会遍历DataTable变量, ...
- Springboot jpa多数据源
1.SpringBootApplication package com.xx.xxx; import org.springframework.beans.factory.annotation.Auto ...
- 025:为什么需要将Logger对象声明为private static final类型的
本文阅读时间大约4分钟. 参考答案 就这个问题而言,我总结了三个原因: 设置为private是为了防止其他类使用当前类的日志对象: 设置为static是为了让每个类中的日志对象只生成一份,日志对象是属 ...