平衡二叉树

mysql索引原理及优化(二)

拜拜、爱过 提交于 2019-11-27 01:05:11
索引原理分析:数据结构 索引是最常见的慢查询优化方式 其是一种优化查询的数据结构,MySql中的索引是用B+树实现,而B+树就是一种数据结构,可以优化查询速度,可以利用索引快速查找数据,优化查询。 可以提高查询速度的数据结构: 哈希表、完全平衡二叉树、B树、B+树等等 。 哈希 :select* from sanguo where name>'周瑜 哈希表的特点是可以快速的精确查询,但是 不支持范围查询 。 完全平衡二叉树 :对于数据量大情况,它相比于哈希或者B树、B+树需要 查找次数更多 。 B树 :比完全平衡二叉树要矮,查询速度更快,所需索引空间更小。 B+树 :B+树比B树要胖,B+树的非叶子节点会冗余一份在叶子节点中,并且也在 叶子节点会用指针相连 。 B树相比完全平衡二叉树查询次数更少,即有更少的磁盘IO次数,性能更优; B+树是B树的升级版 ,其为了提高范围查找的效率。 总结:Mysql选用B+树这种数据结构作为索引, 可以提高查询索引时的磁盘IO效率,并且可以提高范围查询的效率,并且B+树里的元素也是有序的。 索引的最左前缀原则:当建立多个字段联合索引时,如(a,b,c) 查询条件只会走三类索引 即 a 、 ab 、 abc, ac也走,但是只走a索引。 为什么哈希表、完全平衡二叉树、B树、B+树都可以优化查询,为何Mysql独独喜欢B+树? 哈希表有什么特点?

数据结构—平衡二叉树

走远了吗. 提交于 2019-11-26 20:47:15
  二叉排序树集中了数组的查找优势以及链表的插入、删除优势,因此在数据结构中占有一定的地位。但在一定的情况下二叉排序树又有可能变为链表,例如插入从1~100的数,这时进行数据查找的效率就要降低。 为了解决二叉排序树这种左右子树深度不均匀的情况引入了一种平衡二叉树(AVLTree): 任何一个节点的左右子树深度差不超过1 .通过这个限定,阻止了二叉树的左右子树深度差较大的情况,维持了二叉树的稳定。   如何让二叉树的左右子树深度差不超过1呢?这就需要对节点进行旋转,也就是当某个节点的左右子树深度超过1时需要对这个节点进行旋转(旋转之后依旧是左子树小于节点小于右子树),重新调整树的结构。 例如:这两棵二叉树虽然结构不同,但是都是二叉排序树,所谓的旋转就是把左边的深度为3的树旋转为右边深度为2的二叉树。        在平衡二叉树进行插入操作时遇到的不平衡情况有多种,但是这么多种情况都可以分解为一下四中基础情景:把它叫做:左左、左右、右右、右左。 在解释这四种情景之前需要先明白一个定义:最小不平衡节点—插入一个节点之后,距离这个插入节点最近的不平衡节点就是最小不平衡节点(如上图左树的10节点)。所有的旋转都是在最小不平衡节点的基础上进行的。 继续解释四种情景命名意义:左左:节点插入在最小不平衡节点的左子树的左子树上。 左右:节点插入在最小不平衡节点的左子树的右子树上面          

平衡二叉树-python

谁都会走 提交于 2019-11-26 19:27:39
思路:平衡二叉树的左右子树的深度相差不能超过1, 因此可以利用上一题求二叉树的深度的函数,对左右子树求最大深度,如果深度小于1,那么就是平衡二叉树了 # -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def IsBalanced_Solution(self, pRoot): # write code here if not pRoot: return True if abs(self.max_depth(pRoot.left) - self.max_depth(pRoot.right)) > 1: return False return self.IsBalanced_Solution(pRoot.left) and self.IsBalanced_Solution(pRoot.right) def max_depth(self, pRoot): if not pRoot: return 0 return max(self.max_depth(pRoot.left), self.max_depth(pRoot.right)) + 1 来源: https://www

leetcode110. 平衡二叉树

感情迁移 提交于 2019-11-26 13:45:49
题目描述 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树 每个节点 的左右两个子树的高度差的绝对值不超过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 。 思路 求高度。用一个变量来记录是否平衡。 代码 /** * 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 res = true; bool isBalanced(TreeNode* root) { dfs(root); return res; } int dfs(TreeNode* root){ if (!root) return 0; int l = dfs(root->left); int r =