平衡二叉树

AVL平衡二叉查找树

醉酒当歌 提交于 2019-12-01 16:53:59
二叉排序树: 定义 二叉排序树,又叫二叉查找树,它或者是一棵空树;或者是具有以下性质的二叉树: 1. 若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 2. 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值; 3. 它的左右子树也分别为二叉排序树。 比如下图就是一棵普通的二叉排序树: 如果按照中序遍历的顺序,一棵二叉排序树的输出结果就刚好是按照从小到大的顺序输出的,可以运用于二分算法。 先对其数据结构进行定义: typedef struct Binary_Tree_node { int data; //数据域 struct Binary_Tree_node* lchild, * rchild; //左右孩子结点 }Binode, * BiTree; 然后是插入操作: //假设没有相等的data,这里我们不考虑相等的数据 //插入结点 void Insert_Binary_Tree(BiTree& bst ,int t) //bst是根节点 { if (bst == NULL) //空树或者递归到了叶结点 { BiTree newp = new Binode; newp->data = t; newp->lchild = NULL; newp->rchild = NULL; bst = newp; } else { if (t > bst->data) /

判断二叉树是不是平衡二叉树

ぃ、小莉子 提交于 2019-12-01 07:47:58
//判断一个树是不是平衡二叉树 //任何节点的左子树和右子树高度差不超过1 public class BalanceTree { public static void main(String[] args) { Node root = new Node(1); root.left = new Node(2); root.right = new Node(3); root.left.left = new Node(4); root.left.right = new Node(5); root.right.left = new Node(6); root.right.right = new Node(7); root.left.right.left = new Node(8); root.left.right.left.left = new Node(9); System.out.println(isB(root)); } public static boolean isB(Node head) { return process(head).isB; } public static returnData process(Node head) { if (head == null) { return new returnData(true, 0); } returnData

【LeetCode】平衡二叉树

混江龙づ霸主 提交于 2019-11-30 23:36:49
【问题】给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例 1: 给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7 返回 true 。 【思路】 对于平衡树来说, 其要求是左右子树的深度之差不能大于1 ,我们使用一个简单的递归思路来解决,当然也可以使用非递归,不过比较复杂! 由于我们需要知道左右子树的深度,那么递归的返回值显然是左右子树的深度,但我们整个主函数是返回一个bool, 因此我们将bool变量flag设置为类中的成员变量,通过递归函数对其值进行更新。 /** * 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; int check(TreeNode* node){ if(node == nullptr) return 0; int l = 1 + check

55-平衡二叉树

蹲街弑〆低调 提交于 2019-11-29 21:38:39
题目:输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左、右子树的深度相差不超过1,那么它就是一棵平衡二叉树。 def tree_depth(root): if not root: return 0 left = tree_depth(root.left) right = tree_depth(root.right) if left>right: return left+1 else: return right+1 def is_balanced(root): if not root: return True left = tree_depth(root.left) right = tree_depth(root.right) diff = left-right if diff>1 or diff<-1: return False return is_balanced(root.left) and is_balanced(root.right)   注:求出左右子树的深度,然后求差,判断差是否否和平衡条件。一直遍历到叶子结点,如果其中任何一个节点不平衡即返回False。 来源: https://www.cnblogs.com/kingshine007/p/11534502.html

二叉树的算法时间复杂度

你离开我真会死。 提交于 2019-11-29 18:51:13
二叉搜索树,平衡二叉树,红黑树的算法效率 操作 二叉查找树 平衡二叉树 红黑树 查找 O(n) O(logn) Olog(n) 插入 O(n) O(logn) Olog(n) 删除 O(n) O(logn) Olog(n) Olog(n)怎么算出来的 在一个树中查找一个数字, 第一次在根节点判断,第二次在第二层节点判断 以此类推,树的高度是多少就会判断多少次 树的高度和节点的关系就是以2为底,树的节点总数n的对数 来源: https://www.cnblogs.com/geektcp/p/11526925.html

平衡二叉树

点点圈 提交于 2019-11-29 13:23:17
输入一棵二叉树,判断该二叉树是否是平衡二叉树。 最直接的做法,遍历每个结点,借助一个获取树深度的递归函数,根据该结点的左右子树高度差判断是否平衡,然后递归地对左右子树进行判断。 public classSolution { public boolean IsBalanced_Solution(TreeNode root) { if(root == null) { return true; } return Math.abs(maxDepth(root.left) - maxDepth(root.right)) <= 1 && IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right); } private int maxDepth(TreeNode root) { if(root == null) { return 0; } return 1 + Math.max(maxDepth(root.left), maxDepth(root.right)); } } 这种做法有很明显的问题,在判断上层结点的时候,会多次重复遍历下层结点,增加了不必要的开销。如果改为从下往上遍历,如果子树是平衡二叉树,则返回子树的高度;如果发现子树不是平衡二叉树,则直接停止遍历,这样至多只对每个结点访问一次。 public class

红黑树原理及平衡二叉树旋转详解_一点课堂(多岸学院)

孤者浪人 提交于 2019-11-29 06:03:14
红黑树 树的介绍 树具有的特点有: (1)每个结点有零个或多个子结点 (2)没有父节点的结点称为根节点 (3)每一个非根结点有且只有一个父节点 (4)除了根结点外,每个子结点可以分为多个不相交的子树 名词理解: 结点:指树中的一个元素; 结点的度:指结点拥有的子树的个数,二叉树的度不大于2; 叶子:度为0的结点,也称为终端结点; 高度:叶子节点的高度为1,根节点高度最高; 父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点 子节点:子节点是父节点的下一层节点。 - 节点的层次:从根节点开始,根节点为第一层,根的子节点为第二层,以此类推 - 兄弟节点:拥有共同父节点的节点互称为兄弟节点 度 树的深度(Depth)或高度是树中结点的最大层次。 二叉树 二叉树是每个结点最多有两个子树的树结构。 它有五种基本形态:二叉树可以是空集;根可以有空的左子树或右子树;或者左、右子树皆为空。 为什么需要平衡二叉树? 为了避免这种情况的发生,我们希望可以有一种算法,将我们的不平衡的二叉排序树转化为平衡二叉排序树。这样就可以让我们的二叉排序树结构最优化。 平衡因子 该节点左子树的高度-该节点右子树的高度,既左右子树高度之差。 平衡二叉树旋转 LL型 LR型 RR型 一次旋转调整 RL型 第一次旋转,RR型 第二旋转,RR型进行调整 情况一 添加新节点3 按照LL型,进行一次右旋调整 情况二

二叉树基本原理

强颜欢笑 提交于 2019-11-28 22:36:25
二叉树,是度为二的树,二叉树的每一个节点最多只有二个子节点,且两个子节点有序。 下面开始介绍几种常见的二叉树类型: 1. 完全二叉树 若设二叉树的深度为k,除第k层外,其他各层(1~(k-1)层)的节点数都达到最大值,且第k层所有的节点都连续集中在最左边,这样的树就是完全二叉树。如图: (图片仅参考网友,侵删) 完全二叉树是一种效率很高的数据结构,而堆是一种完全二叉树或者近似完全二叉树,因此堆的效率也很高;像十分常用的排序算法、Dijkstra算法、Prim算法等都要用堆才能优化,二叉排序树的效率也要借助平衡性来提高,而平衡性是基于完全二叉树的。 (以上摘自: https://www.jianshu.com/p/6a30657bf894 ) 2. 满二叉树 满二叉树的定义分两种:国内定义和国外(国际)定义。 国内定义:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。如图: 国外(国际)定义:如果一棵二叉树的结点要么是叶子结点,要么它有两个子结点,这样的树就是满二叉树。(一棵满二叉树的每一个结点要么是叶子结点,要么它有两个子结点,但是反过来不成立,因为完全二叉树也满足这个要求,但不是满二叉树),如图: 当然,不难看出,国外(国际)的定义已经包含了国内的定义了,也就是国内的定义是国外定义的子集。 (以上摘自: https://baike.baidu.com

AVL-平衡二叉树的原理和实现

眉间皱痕 提交于 2019-11-28 21:47:25
一、简介   本文将通过图解和代码详细讲解AVL平衡二叉树的性质及失衡和再平衡的内容。在看本文之前希望大家具备二分搜索树的相关知识。或移步 《二分搜索树》 了解二分搜索树。 二、平衡二叉树   前面关于二分搜索树的文章,最后分析了在极端情况下,二分搜索树会退化为一个链表,那为了避免这种情况的发生,AVL平衡二叉树应运而生。   平衡二叉树的定义: 1 平衡二叉树是一颗二分搜索树,及平衡二叉树满足二分搜索树的所有性质 2 平衡二叉树要求任意一个节点的左右子树的高度差不能超过1   对于第一点应该挺容易理解的,对于第二点,我们要做一点解释。对于高度差,有一个专有名词平衡因子。    平衡因子 :左子树的高度减去右子树的高度,及B = B左 - B右。由平衡二叉树的定义可知,平衡因子的取值只可能为0,1,-1。0:左右子树等高。1:左子树比较高。-1:右子树比较高。如下图    高度: 一般的我们取叶子节点的高度值为1,任意一个节点的高度值取左右子树比较高的那个孩子节点的高度值然后加1。比如上图1中20这个节点的高度值,显然左子树比较高,所以H20 = H10 + 1;依次类推,H10 = H6(或者H14) + 1 = 2;所以H20 = 3;   上图1的树的各个节点的高度,如下图1所示。各个节点的平衡因子如下图2红色数字所示。所以根据定义,各个节点的左右子树的高度差不能超过1

剑指offer39:平衡二叉树

纵饮孤独 提交于 2019-11-28 18:58:46
1 题目描述   输入一棵二叉树,判断该二叉树是否是平衡二叉树。 2 思路和方法   平衡二叉树,又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间,不过相对二叉查找树来说,时间上稳定了很多。https://blog.csdn.net/qq_43091156/article/details/88558966   从 叶节点开始 ,依次往上求其子树高度,如果在某一子树上不满足要求,则一路返回,不再继续遍历。即, 先依次遍历左子树,如果左子树是平衡二叉树,再依次遍历右子树。 时间最坏O(n),空间O(n)。 3 C++核心代码 1 class Solution { 2 public: 3 // 返回值:树的深度 4 bool IsBalanced_Solution(TreeNode* pRoot){ 5 if (pRoot == nullptr) 6 return true; // ko 7 return TreeDepth(pRoot)!=-1; 8 } 9 10 // 返回值: 11 // -1:子树不平衡 12