首页
学习
活动
专区
圈层
工具
发布

平衡二叉树与红黑树的区别_平衡二叉树怎么构造

平衡二叉树与红黑树 一、红黑树的性质: 二、红黑树的主要用途,和其他树的比较: 三、运用场景 一、红黑树的性质:    红黑树是一颗二叉搜索树,通过对任何一条从根到叶子的简单路径上各个结点的颜色进行约束...——引用自《算法导论》 第十三章 红黑树 红黑树的性质   红黑树的平衡通过旋转实现,任何不平衡都会在三次旋转之内解决。...3.AVL树是严格维持平衡的,红黑树是黑平衡的。...对于1024个数据,二叉树则需要10层,查询要遍历的扇区过多。     B+树是B树的变种树,有n棵子树的节点中含有n个关键字,每个关键字不保存数据,只用来索引,数据都保存在叶子节点。...nginx定时器实现的源码有下面几个接口 3.1.1初始化定时器 来看一下ngx_event_timer_init这个函数是怎么实现的, 在 src/event/ngx_event_timer.c

61721
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    小文’s blog — 平衡二叉树构造方法

    平衡二叉树又称为AVL树,它或者是一棵空树,或者是有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左右子树的深度之差的绝对值不超过1。...二叉树的的平衡因子BF为:该结点的左子树的深度减去它的右子树的深度,则平衡二叉树的所有结点的平衡因子为只可能是:-1、0和1 一棵好的平衡二叉树的特征: (1)保证有n个结点的树的高度为O(logn)...(2)容易维护,也就是说,在做数据项的插入或删除操作时,为平衡树所做的一些辅助操作时间开销为O(1) 平衡二叉树的构造 在一棵二叉查找树中插入结点后,调整其为平衡二叉树。...(2)RR型 RR型:插入位置为右子树的右孩子,进行向左旋转 image.png 由于在A的右子树C的右子树插入了结点F,A的平衡因子由-1变为-2,成为不平衡的最小二叉树根结点。...此时,A结点逆时针左旋转,遵循“旋转优先”的规则,A结点替换D结点成为C的左子树,D结点成为A的右子树。

    45230

    C++ - AVL平衡二叉树

    AVL树的概念与特点 AVL树是一种自平衡的二叉查找树,平衡二叉树且搜索二叉树 定义与特点 定义: AVL树是最先发明的自平衡二叉查找树。...虽然AVL树并不必须要平衡因子,但是有了平衡因子可以更方便观察和控制树是否平衡。 高度要求: AVL树是高度平衡搜索二叉树,通过控制高度差去控制平衡。...AVL树的结构(这里开始讲代码) 首先,它的底层是搜索二叉树的基础上进行的,所以会像搜索二叉树 struct AVLTreeNode { AVLTreeNode(const T& data =...//我会写删除的,就在本篇一起写了 private: Node* _pRoot; }; AVL树的插入 像搜索二叉树一样直接插入 新增节点后更新平衡因子 检测平衡因子,若不平衡开始旋转 根据平衡因子对不平衡子树开始向上旋转...subRL->_bf = 0; pParent->_bf = 0; } else { assert(false); } } AVL树的查找 就是搜索二叉树的查找

    16310

    平衡二叉树

    因此引入了平衡二叉树(AVL树)——节点左右子树的高度差的绝对值不超过1....当我们把一个节点插入到平衡二叉树中的时候,就有可能打破原有的平衡,这时候我们就需要调整该树,使它继续保持平衡二叉树的特性。...插入的情况 插入一个节点,只会影响它父亲的平衡因子,而父亲节点平衡因子的变化也会影响它的父亲节点 如果插入的是父节点的左边,父亲节点的平衡因子减1 如果插入的是父节点的右边,父亲节点的平衡因子加1...什么情况下才会使插入节点所在的路径上节点的平衡因子不在发生变化呢?...当按上面的规则执行之后,节点的平衡因子为0,说明左右子树都平衡了,就不用继续往上进行调整了,或者已经调整到根节点了,就不用调整了。

    24210

    平衡二叉树

    定义 它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。 ?...平衡二叉树 对于一般的二叉搜索树(Binary Search Tree),其期望高度(即为一棵平衡树时)为logn,其各操作的时间复杂度(O(logn))同时也由此而决定。...但是,在某些极端的情况下(如在插入的序列是有序的时),二叉搜索树将退化成近似链或链,此时,其操作的时间复杂度将退化成线性的,即O(n) 而平衡二叉树在插入的时候,通过左旋/右旋的方式来保证整颗二叉树的高度不会有太大的差别...Pivot节点右旋 过程: 将P节点所在左节点的右子树R接到P节点的左子树R(也就是将Y节点的c子树拼接到Pivot的左子树),修改右子树L的parent以及P节点的左子树指向 将P节点所在左节点的Parent...else p.parent.left = l; l.right = p; p.parent = l; } } 常见的不完全平衡二叉树

    1.2K30

    平衡二叉树

    定义 最小不平衡子树 基本思想 构造平衡二叉树 二叉平衡树调整的四种类型 总结 完整代码 #include using namespace std; //平衡二叉树...因此下面我们要对oldRoot下面的左子树newRoot的bf进行判断,看是LL还是LR的情况 switch (newRoot->bf) { case LH://LL的情况---右旋处理,处理完后,最小不平衡子树变为平衡二叉树...: #include using namespace std; //平衡二叉树 //定义节点结构体 typedef struct BiNode { int data;//数据域...因此下面我们要对oldRoot下面的左子树newRoot的bf进行判断,看是LL还是LR的情况 switch (newRoot->bf) { case LH://LL的情况---右旋处理,处理完后,最小不平衡子树变为平衡二叉树...因此下面我们要对oldRoot下面的左子树newRoot的bf进行判断,看是LL还是LR的情况 switch (newRoot->bf) { case LH://LL的情况---右旋处理,处理完后,最小不平衡子树变为平衡二叉树

    34420

    平衡二叉树

    平衡二叉树 给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。...示例 给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7 返回 true。...dfs(root); return target; }; 思路 定义一个深度递归遍历的函数,在一个节点中获取树的左右子树的高度,也就是定义获取树的高度的函数,在获取左右子树的高度时比较左右子树是否平衡即可...,首先定义目标变量target,之后定义深度递归遍历dfs函数,在函数中判断节点不存在则返回0,接下来是一部分剪枝,如果已经找到了不平衡的位置那么就没有必要继续向下遍历,之后定义l为左子树的高度,r为右子树的高度...,之后进行比较如果做右子树的高度差大于1则认为其不是平衡二叉树,赋值target为false,之后返回做右子树中高的子树的高度+1,执行dfs深度递归遍历,完成后返回target即可。

    29120

    平衡二叉树

    那么为了使整棵树基金可能平衡,那么在构造树的过程中必须随时检查每个结点的平衡因小于等于。...如下图所示,不平衡的原因是因为A的左孩子B的左子树插入了新结点而导致了A的不平衡,那么就要利用LL旋转来调整不平衡结点A,由于平衡二叉树一定是二叉搜索树,设定插入结点为C,那么根据二叉搜索树的性质一定有...如下图所示,不平衡的原因是因为A的右孩子B的右子树插入了新结点而导致了A的不平衡,那么就要利用RR旋转来调整不平衡结点A,由于平衡二叉树一定是二叉搜索树,设定插入结点为C,那么根据二叉搜索树的性质一定有...如下图所示,不平衡的原因是因为A的左孩子B的右子树插入了新结点而导致了A的不平衡,那么就要利用LR旋转来调整不平衡结点A,由于平衡二叉树一定是二叉搜索树,设定插入结点为C,那么根据二叉搜索树的性质一定有...如下图所示,不平衡的原因是因为A的右孩子B的左子树插入了新结点而导致了A的不平衡,那么就要利用RL旋转来调整不平衡结点A,由于平衡二叉树一定是二叉搜索树,设定插入结点为C,那么根据二叉搜索树的性质一定有

    75040

    平衡二叉树

    为了解决上面的问题,平衡二叉树(AVL树)就应运而生了。 2. 什么是平衡二叉树?...平衡二叉树又叫AVL树,也叫平衡二叉搜索树,可以保证较高的查询效率; 它是一棵空树,或者是左右子树的高度差的绝对值不会超过1,并且左右两棵子树都是一棵平衡二叉树; 平衡二叉树常用的实现算法有红黑树,AVL...如何创建平衡二叉树? (1)....左旋转思路: 假如现有数列:4,3,6,5,7,8,创建出来的二叉树排序数如下图: 二叉排序树 节点4的左子树高度为1,右子树高度为3,高度差是2,所以不是平衡二叉树。...如果要将其变成平衡二叉树该怎么做呢?因为其右子树的高度更高,要分点儿给左子树,所以方法叫做左旋转。

    32510

    平衡二叉树

    平衡二叉树的定义: 结论:给定节点数为n的avl树的最大高度为0(log2n) 平衡二叉树的调整:rr旋转,ll旋转,lr旋转和rl旋转 typedef struct AVLNode *Position...;        return B; } AVLTree DoubleLeftRightRotation ( AVLTree A ) { /* 注意:A必须有一个左子结点B,且B必须有一个右子结点C...*/   /* 将A、B与C做两次单旋,返回新的根结点C */          /* 将B与C做右单旋,C被返回 */     A->Left = SingleRightRotation(A->Left...);     /* 将A与C做左单旋,C被返回 */     return SingleLeftRotation(A); } /***********************************...GetHeight(T->Right) ) + 1;          return T; } 废江博客 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 转载请注明原文链接:平衡二叉树

    24850

    平衡二叉树

    ,判断该树是不是平衡二叉树。...如果某二叉树中任意节点的左右子树的深度相差不超过 1,那么它就是一棵平衡二叉树。...限制:0 <= 树的结点个数 <= 10000 基本知识点 二叉树的每个节点最多有两个子节点,平衡二叉树中任意一个节点的左右子树高度相差不能大于 1,满二叉树和完全二叉树都是平衡二叉树,普通二叉树有可能是平衡二叉树...题解 解法一 思路 若想判断二叉树是不是平衡二叉树,只需要判断左右子树的高度差是不是不超过 1 即可。同时,要满足一个树是平衡二叉树,它的子树也必须是平衡二叉树。...我们可以从根结点开始,通过递归来求得子树的高度,以及子树是否是平衡二叉树,以此来结合判断二叉树是否是平衡二叉树。 代码 /** * Definition for a binary tree node

    44411
    领券