平衡二叉树建立、实现和判断
(一)平衡二叉树
1. 定义 它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
2. 建立序列结点依次插入,构建平衡二叉树,为了保持各节点的平衡,根据各结点的插入位置,采用不同的旋转方式构建平衡二叉树
平衡二叉树旋转原理参考https://blog.csdn.net/innobase/article/details/51298037
(二)平衡二叉树的建立代码实现
package tree;/*** 平衡二叉树(AVL树)* 这里只模拟int类型实现,如果需要其他类型,请将int类型修改为泛型,并实现extends Comparable<T>接口,方便比较* 动态模拟实现:https://www.cs.usfca.edu/~galles/visualization/AVLtree.html* GitHub地址:https://github.com/hack-feng/algorithm*/
public class AVLTree{private Node root;static class Node{int data;Node left;Node right;int height;Node(Node left, Node right, int data) {this.left = left;this.right = right;this.data = data;this.height = 0;}}// 插入节点private void insert(int data){root = insert(data, root);}private Node insert(int data, Node node){if(node == null){Node returnNode = new Node(null, null, data);// 新创建的树,高度默认为1returnNode.height = 1;return returnNode;}else{// 如果root.data的值大于data, 则在左子树上插入,否则在右子树上插入if(node.data > data){node.left = insert(data, node.left);// 判断树是否失衡,失衡需要旋转if(getHeight(node.left) > getHeight(node.right) + 1){// 判断进行两次旋转还是一次旋转if(node.left.data > data){//(LL)一次旋转, 右旋node = LL(node);}else{//(LR)两次旋转, 先左旋,再右旋node = LR(node);}}}else{node.right = insert(data, node.right);// 判断树是否失衡,失衡需要旋转if(getHeight(node.right) > getHeight(node.left) + 1){// 判断进行两次旋转还是一次旋转if(node.right.data > data){//(RL)两次旋转,先右旋,再左旋node = RL(node);}else{//(RR)一次旋转,左旋node = RR(node);}}}// 重新计算树的高度node.height = setHeight(node);return node;}}// 左左情况, 进行一次右旋private Node LL(Node node){Node leftNode = node.left;node.left = leftNode.right;leftNode.right = node;//重新计算高度node.height = setHeight(node);leftNode.height = setHeight(leftNode);return leftNode;}// 左右情况, 先进行左旋,再进行一次右旋private Node LR(Node node){node.left = RR(node.left);node = LL(node);return node;}// 右右情况, 进行一次左旋private Node RR(Node node){Node rightNode = node.right;node.right = rightNode.left;rightNode.left = node;//重新计算高度node.height = setHeight(node);rightNode.height = setHeight(rightNode);return rightNode;}// 右左情况,先进行右旋,再进行一次左旋private Node RL(Node node){node.right = LL(node.right);node = RR(node);return node;}// 获取树的高度private int getHeight(Node node){return node == null ? 0 : node.height;}// 重新计算树的高度private int setHeight(Node node){return Math.max(getHeight(node.left), getHeight(node.right)) + 1;}// 打印节点private void printNode(Node root){if(root != null){printNode(root.left);System.out.println(root.data);printNode(root.right);}}public static void main(String [] args){
// int[] dataArray = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9};int[] dataArray = new int[]{2, 8, 5, 6, 7, 4, 3, 1, 9};AVLTree tree = new AVLTree();for (int i : dataArray) {tree.insert(i);}tree.printNode(tree.root);}
}
(三)判断一棵树是否是平衡二叉树(leetcode)
class Solution {
public:bool flag=true;bool isBalanced(TreeNode* root) {postSearch(root);//后序遍历return flag;}int postSearch(TreeNode *root){if(root==NULL) return 0;int left=postSearch(root->left);//当前节点左子树高度int right=postSearch(root->right);//当前节点右子树高度if(abs(left-right)>1) flag=false;//判平衡return max(left,right)+1;//当前结点的子树的高度}
};
平衡二叉树建立、实现和判断相关推荐
- 高度平衡二叉树的构建_平衡二叉树建立及其增删改查(JAVA)
平衡二叉树:指的是左右子树高度差的绝对值不超过一的二叉排序树. 主要思路:1.用左高度跟右高度代替平衡因子,大于1进行L~调整,小于-1进行R~调整 2.每次插入都通过递归计算一次各结点高度,然后进行 ...
- mysql判断是否建立索引_判断mysql中列是否要添加索引的标准
最近再看mysql技术内部+innoDb存储引擎一书,书中第五章-索引与算法中讲到 查看表的索引信息中的一些参数含义,特作记录 show index from table_name ## 查看该表的 ...
- 判断二叉树是否平衡二叉树
题目 平衡二叉树的性质为:要么是一颗空树,要么任何一个节点的左右子树高度差的绝对值不超过1.给定一棵二叉树的头结点head,判断这棵二叉树是否为平衡二叉树. 难度:? 基础理解 以下是个人认为对概念叙 ...
- powerdesigner建立UML活动图
UML活动图(动态行为图) 将进程或其他计算结构展示为计算内部的控制流和数据流,主要用来描述系统的动态视图. 类似程序流程图,表示流程性的东西和并行的行为.它将进程或其他计算结构展示为计算内部一步步的 ...
- c语言建立栈(顺序栈、双栈和链式栈)
c语言建立栈 顺序存储 栈的顺序存储定义 初始化栈 入栈操作 出栈操作 其余操作 读取栈顶元素 栈中元素个数 栈是否为空 双栈 双栈的顺序存储结构定义 建立双栈 判断栈为空 进栈操作 出栈操作 链式栈 ...
- 算法 --- 平衡二叉树
解题思路: 1.首先写一个返回深度的函数d 2.写一个遍历函数t 3.在t中首先判断,r是否为空(为空则此时就是平衡二叉树,返回true),然后判断是否为叶子节点(r.left ===null &am ...
- 平衡二叉树、二叉排序树-数据结构
数据结构之平衡二叉树建立:https://www.cnblogs.com/zhujunxxxxx/p/3348798.html 平衡二叉树(AVL树)及C语言实现:http://data.bianch ...
- 平衡二叉树平衡因子怎么计算_数据结构PHP 平衡二叉树(AVL)的平衡原理
这篇文章主要介绍一下 平衡二叉树(AVL),对于 二分搜索树 来说,如果树上的 元素 是顺序 添加的,会导致数据退化成一个 链表,这样就会造成很严重的性能问题,此时就需要在 二分搜索树 的基础上,保证 ...
- SQL 中判断条件的先后顺序,会引起索引失效么?
点击蓝色"有关SQL"关注我哟 加个"星标",天天与8000人一起快乐成长 在群里看到一个基础题,有关索引的使用. 题目就在这里,有的朋友说选B,有的选C,有的 ...
- 朴素贝叶斯分类(上):如何让机器判断男女?
朴素贝叶斯分类(上):如何让机器判断男女? 当你不能准确预知一个事物本质的时候,可以依靠和事物本质相关的事件来进行判断,如果事情发生的频次多,则证明这个属性更有可能存在 贝叶斯原理 贝叶斯解决一个叫& ...
最新文章
- JavaScript 中的有限状态机
- DOCTYPE声明的几种类型
- 【转】嵌入式产品开发流程
- Redis的哨兵机制 或者心跳机制 模式 原理详解
- Jenkins 持续集成自动化测试配置
- 检测对抗样本_对抗T恤以逃避ML人检测器
- java并发锁获取的方式_Java精通并发-notify方法详解及线程获取锁的方式分析
- Linux就该这么学-第三课
- PK 想说爱你不容易
- java中jsp时间插件_日期插件 - WEB源码|JSP源码/Java|源代码 - 源码中国
- 理解 RESTful
- python数据类型、if判断语句
- 系统学习机器学习之参数方法(二)
- 端到端车道线检测_如何使用Yolov5创建端到端对象检测器?
- Sql Server2005分离数据库
- 国际象棋“马”的走法
- 计算机文件丢失系统无法启动,windows7文件丢失无法启动怎么修复_win7系统显示文件丢失无法启动修复方法-win7之家...
- 关于魔兽守卫军的改进建议
- C51/C52单片机printf打印出来的值是原来值的256倍
- 超快速!10分钟入门Keras指南