(一)平衡二叉树

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;//当前结点的子树的高度}
};

平衡二叉树建立、实现和判断相关推荐

  1. 高度平衡二叉树的构建_平衡二叉树建立及其增删改查(JAVA)

    平衡二叉树:指的是左右子树高度差的绝对值不超过一的二叉排序树. 主要思路:1.用左高度跟右高度代替平衡因子,大于1进行L~调整,小于-1进行R~调整 2.每次插入都通过递归计算一次各结点高度,然后进行 ...

  2. mysql判断是否建立索引_判断mysql中列是否要添加索引的标准

    最近再看mysql技术内部+innoDb存储引擎一书,书中第五章-索引与算法中讲到 查看表的索引信息中的一些参数含义,特作记录 show index from table_name ##  查看该表的 ...

  3. 判断二叉树是否平衡二叉树

    题目 平衡二叉树的性质为:要么是一颗空树,要么任何一个节点的左右子树高度差的绝对值不超过1.给定一棵二叉树的头结点head,判断这棵二叉树是否为平衡二叉树. 难度:? 基础理解 以下是个人认为对概念叙 ...

  4. powerdesigner建立UML活动图

    UML活动图(动态行为图) 将进程或其他计算结构展示为计算内部的控制流和数据流,主要用来描述系统的动态视图. 类似程序流程图,表示流程性的东西和并行的行为.它将进程或其他计算结构展示为计算内部一步步的 ...

  5. c语言建立栈(顺序栈、双栈和链式栈)

    c语言建立栈 顺序存储 栈的顺序存储定义 初始化栈 入栈操作 出栈操作 其余操作 读取栈顶元素 栈中元素个数 栈是否为空 双栈 双栈的顺序存储结构定义 建立双栈 判断栈为空 进栈操作 出栈操作 链式栈 ...

  6. 算法 --- 平衡二叉树

    解题思路: 1.首先写一个返回深度的函数d 2.写一个遍历函数t 3.在t中首先判断,r是否为空(为空则此时就是平衡二叉树,返回true),然后判断是否为叶子节点(r.left ===null &am ...

  7. 平衡二叉树、二叉排序树-数据结构

    数据结构之平衡二叉树建立:https://www.cnblogs.com/zhujunxxxxx/p/3348798.html 平衡二叉树(AVL树)及C语言实现:http://data.bianch ...

  8. 平衡二叉树平衡因子怎么计算_数据结构PHP 平衡二叉树(AVL)的平衡原理

    这篇文章主要介绍一下 平衡二叉树(AVL),对于 二分搜索树 来说,如果树上的 元素 是顺序 添加的,会导致数据退化成一个 链表,这样就会造成很严重的性能问题,此时就需要在 二分搜索树 的基础上,保证 ...

  9. SQL 中判断条件的先后顺序,会引起索引失效么?

    点击蓝色"有关SQL"关注我哟 加个"星标",天天与8000人一起快乐成长 在群里看到一个基础题,有关索引的使用. 题目就在这里,有的朋友说选B,有的选C,有的 ...

  10. 朴素贝叶斯分类(上):如何让机器判断男女?

    朴素贝叶斯分类(上):如何让机器判断男女? 当你不能准确预知一个事物本质的时候,可以依靠和事物本质相关的事件来进行判断,如果事情发生的频次多,则证明这个属性更有可能存在 贝叶斯原理 贝叶斯解决一个叫& ...

最新文章

  1. JavaScript 中的有限状态机
  2. DOCTYPE声明的几种类型
  3. 【转】嵌入式产品开发流程
  4. Redis的哨兵机制 或者心跳机制 模式 原理详解
  5. Jenkins 持续集成自动化测试配置
  6. 检测对抗样本_对抗T恤以逃避ML人检测器
  7. java并发锁获取的方式_Java精通并发-notify方法详解及线程获取锁的方式分析
  8. Linux就该这么学-第三课
  9. PK 想说爱你不容易
  10. java中jsp时间插件_日期插件 - WEB源码|JSP源码/Java|源代码 - 源码中国
  11. 理解 RESTful
  12. python数据类型、if判断语句
  13. 系统学习机器学习之参数方法(二)
  14. 端到端车道线检测_如何使用Yolov5创建端到端对象检测器?
  15. Sql Server2005分离数据库
  16. 国际象棋“马”的走法
  17. 计算机文件丢失系统无法启动,windows7文件丢失无法启动怎么修复_win7系统显示文件丢失无法启动修复方法-win7之家...
  18. 关于魔兽守卫军的改进建议
  19. C51/C52单片机printf打印出来的值是原来值的256倍
  20. 超快速!10分钟入门Keras指南

热门文章

  1. redis学习总结2
  2. java day52【综合案例day04】
  3. EF安装和更新数据库
  4. 尝试一下sql server2016里面的json功能
  5. 关于浏览器的兼容性问题
  6. 快速备份sqlserver2005以上版本数据库的方法-摘自网络
  7. poj 3295 Tautology (构造)
  8. [导入]Asp.Net MVC实践 - 探索UrlRouting并分析UrlHelper (基于ASP.NET MVC Preview 3)
  9. 东山里的传说——《荒原的呼唤》选载之四
  10. Stopwatch 计时器类