平衡二叉树

平衡二叉树(AVL)

喜夏-厌秋 提交于 2020-02-22 18:53:11
文章目录 AVL 平衡二叉树的概念 AVL树的实现原理 AVL树节点的定义 AVL树的插入 AVL树的旋转 AVL树性能分析 AVL 平衡二叉树的概念 平衡二叉树(Self-Balancing Binary Search Tree 或 Height-Balanced Binary Search Tree),是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1. 二叉排序树虽可以缩短查找的效率,但如果 数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下 。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年 发明了一种解决上述问题的方法: 当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度 。 一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树: 它的左右子树都是AVL树 左右子树高度之差(简称平衡因子BF)的绝对值不超过1(-1/0/1) 如果一棵二叉搜索树是高度平衡的,它就是AVL树。如果它有n个结点,其高度可保持在 O ( l o g 2 n ) O(log_2 n) O ( l o g 2 ​ n ) ,搜索时间复杂度O( l o g 2 n log_2 n l o g 2 ​ n

51.二叉树的深度 + 平衡二叉树

杀马特。学长 韩版系。学妹 提交于 2020-02-22 12:30:27
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 int TreeDepth(TreeNode* pRoot) { if(!pRoot) return 0; return 1 + max(TreeDepth(pRoot->left) , TreeDepth(pRoot->right)); } 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 低效率思路:调用上面的函数,使左右子树深度差不超过1,但是一个节点会被重复遍历多次 高效率思路:边遍历边观察是不是平衡,剪枝思想 int getDepth(TreeNode *pRoot){ if(!pRoot) return 0; int left = getDepth(pRoot->left); if(left == -1) return -1; int right = getDepth(pRoot->right); if(right == -1) return -1; return abs(left - right) > 1 ? -1 : 1 + max(left, right); } bool IsBalanced_Solution(TreeNode* pRoot) { return getDepth(pRoot) != -1; } 来源: CSDN 作者: 红尘倥偬

【LeetCode110】平衡二叉树

谁说胖子不能爱 提交于 2020-02-22 12:21:28
一.题目:平衡二叉树 二.算法思想 利用depth函数求解每个结点的二叉树高度,利用isBalanced函数:求解结点的左右子树的高度差是否≤1且递归遍历左右子树的结点是否平衡。 【缺点】耗内存 三.代码 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: bool isBalanced(TreeNode* root) { if(!root) return true; int plus=abs(depth(root->left)-depth(root->right));//当前结点的左右子树高度差 return (plus<=1)&&(isBalanced(root->left)&&(isBalanced(root->right))); } //求解二叉树的高度 int depth(TreeNode* node){ if(node==NULL) return 0; return max(depth(node->left),depth(node-

Java实现 LeetCode 110 平衡二叉树

穿精又带淫゛_ 提交于 2020-02-19 10:53:14
110. 平衡二叉树 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例 1: 给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7 返回 true 。 示例 2: 给定二叉树 [1,2,2,3,3,null,null,4,4] 1 / \ 2 2 / \ 3 3 / \ 4 4 返回 false 。 PS: 模版一共三步,就是递归的三部曲: 找终止条件:什么时候递归到头了?此题自然是root为空的时候,空树当然是平衡的。 思考返回值,每一级递归应该向上返回什么信息?参考我代码中的注释。 单步操作应该怎么写?因为递归就是大量的调用自身的重复操作,因此从宏观上考虑,只用想想单步怎么写就行了,左树和右树应该看成一个整体,即此时树一共三个节点:root,root.left,root.right。 class Solution { //这个ReturnNode是参考我描述的递归套路的第二步:思考返回值是什么 //一棵树是BST等价于它的左、右俩子树都是BST且俩子树高度差不超过1 //因此我认为返回值应该包含当前树是否是BST和当前树的高度这两个信息 private class ReturnNode{ boolean isB; int depth

100000614 - 《算法笔记》9.5小节——数据结构专题(2)->平衡二叉树(AVL)

流过昼夜 提交于 2020-02-17 23:13:36
文章目录 9.5小节——数据结构专题(2)->平衡二叉树(AVL) 9.4.1-平衡二叉树的定义 9.4.2-AVL的基本操作 1-查找 2-插入 3-AVL树的建立 AVL树的基本操作代码集合 Codeup习题 问题 A: 算法9-9~9-12:平衡二叉树的基本操作 平衡二叉树小结 9.5小节——数据结构专题(2)->平衡二叉树(AVL) 9.4.1-平衡二叉树的定义 AVL是增加了平衡条件的二叉查找树,即对AVL树的任意结点来说其左子树与右子树高度之差的绝对值不超过1,其中左子树与右子树的高度之差称为该结点的平衡因子。 9.4.2-AVL的基本操作 其基本操作有查找、插入、建树、删除。 1-查找 和二叉查找树的查找一致 //查找 int search ( node * root , int v ) { if ( root == NULL ) { //空树,查找失败 // printf("search failed\n"); return 0 ; } if ( v == root - > v ) { // printf("%d\n",root->data); return 1 ; } else if ( v < root - > v ) { search ( root - > lchild , v ) ; } else { search ( root - > rchild , v

LeetCode-110、平衡二叉树-简单

对着背影说爱祢 提交于 2020-02-11 06:54:20
LeetCode-110、平衡二叉树-简单 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵 高度平衡二叉树 定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例 1: 给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7 返回 true 。 示例 2: 给定二叉树 [1,2,2,3,3,null,null,4,4] 1 / \ 2 2 / \ 3 3 / \ 4 4 返回 false 。 代码1:自底向上 # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def isBalanced(self, root: TreeNode) -> bool: return False if self.depth(root)==-1 else True def depth(self, node): if not node: return 0 left = self.depth(node.left) if left == -1: return -1 right = self

Mysql索引那些事情

冷暖自知 提交于 2020-02-09 03:22:20
什么是索引? 索引在搜索引擎优化简单解释 指已经被收录且参与关键词排名的页面。 索引的通俗解释 索引就像是图书的目录,根据目录中的页码快速找到所需内容。 索引在百度百科中的解释 在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。 MySQL官方对索引的定义为: 索引(Index)是帮助MySQL高效获取数据的数据结构。我们可以简单理解为:**快速查找排好序的一种数据结构。**Mysql索引主要有两种结构:B+Tree索引和Hash索引。我们平常所说的索引,如果没有特别指明,一般都是指B树结构组织的索引(B+Tree索引) 有哪些索引算法 hash算法 什么是hash 如果有编程经验的小伙伴都知道不管是哪种语言都是有hash实现,简单来说就是一个 key 通过一个 hash(key) 算法后得到一个固定长度值,可以通过这个计算后的值与存放数据容器长度取模后的值做索引,快速定位元素( 可以看作类似数组索引 ),查询时间复杂度为O(1),在java里面一个对象可以重写hashCode()方法。 hash数据结构 存在问题 只支持等值索引定位 hash算法虽然能快速定位元素位置,时间复杂度O(1)查询速度是相当可观的, but 这个作为 mysql

牛客网 平衡二叉树

元气小坏坏 提交于 2020-02-08 14:59:11
题目: 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 解题: public class Solution { public boolean IsBalanced_Solution(TreeNode root) { return getDepth(root) != -1;//-1则不是平衡二叉树 } private int getDepth(TreeNode root) { if (root == null) return 0; int left = getDepth(root.left); if (left == -1) return -1; int right = getDepth(root.right); if (right == -1) return -1; return Math.abs(left - right) > 1 ? -1 : 1 + Math.max(left, right); } } 来源: https://www.cnblogs.com/yanhowever/p/12283391.html

leetcode 平衡高度二叉树/** * Definition for a binary tree node. * public class TreeNode { * int val;

旧街凉风 提交于 2020-02-06 16:39:39
思路:前提会 计算二叉树最大深度(在计算二叉树最大深度的时候,就是采用递归的方法,取左右子树的最大); 所以稍加改造,在每次计算左右子树的最大深度之后,加一个if ,判断是否满足,绝对值之差不超过1,如果不满足,就赋值给一个flag private boolean result = true; public boolean isBalanced(TreeNode root) { maxDepth(root); return result; } public int maxDepth(TreeNode root) { if (root == null) return 0; int l = maxDepth(root.left); int r = maxDepth(root.right); if (Math.abs(l - r) > 1) result = false; return 1 + Math.max(l, r); } 来源: CSDN 作者: only凡星 链接: https://blog.csdn.net/a13734123851/article/details/104194562

数据结构课设 - 平衡二叉树的演示

筅森魡賤 提交于 2020-02-03 23:55:26
平衡二叉树的演示 一、需求分析: (1) 构建一个平衡二叉树并实现创建、插入、查找、删除、销毁等操作。每种操作均提示输入关键字。每次插入或删除一个结点后,更新平衡二叉树的显示。 (2) 平衡二叉树的显示采用凹入表现形式。 (3)输入的形式时数字,无论对功能的选择还是对数据的录入,都是以数字的形式进行输入,无需使用文件保存数据。  (4) 输出的形式时在dos界面进行输出,一旦检测到错误的输入就会报错提示用户从新输入。 (5)程序所能达到的功能: A:创建一颗非空平衡二叉树 B:向平衡二叉树中添加结点 C:从平衡二叉树中删除结点 D:在平衡二叉树中查找结点 E:销毁平衡二叉树 F:输出打印一棵平衡二叉树 G:合并两棵平衡二叉树 H:分裂一颗平衡二叉树 # include <stdio.h> # include <string.h> # include <stdlib.h> # include <conio.h> # define OK 1 # define ERROR 0 # define TRUE 1 # define FALSE 0 # define OVERFLOW 0 # define LH +1 //左子树比右子树高 # define EH 0 //等高 # define RH -1 //右子树比左子树高 typedef int Status ; typedef int