首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

玩转红黑树:手把手教你实现和理解红黑树

如果一个结点是红的,则它的两个儿子都是黑的。对每个结点,从该结点到其子孙结点的所有路径上的 包含相同数目的黑结点 。满足以上性质的二叉树就是红黑树。...为了检查是否真正理解了红黑树的性质,这里提供如下的判断题,请判断哪个是红黑树,哪个不是:从黑色节点的高度判断,14(黑)–> 8(红)–> NIL(黑),黑高为2;14(黑)–> 8(红)–> 10(黑...从黑色节点的高度判断,14(黑)–> 8(红)–> NIL(黑),黑高为2;14(黑)–> 8(红)–> 10(黑)NIL(黑),黑高是3。...改变x的右指针指向和y左子树的父指针指向,这里需要判断y的左子树是否是叶子节点x->right = y->left;if (y->left !...改变y的父指针指向和x的父节点左子树的指向,这里需要判断x是不是根节点以及判断x节点是其父节点的左子树还是右子树y->parent = x->parent;if (x->parent == T->nil

19200

实现一个红黑树

红黑树在数据结构中,如果提到编码和压缩绕不开 Hoffman 树,如果从快速获取搜索的树结构那么就离不开红黑树,哈希表设计中,从数组加链表,不行我就数组加红黑树,大名鼎鼎的 epoll 也开始起了红黑树...红黑树的规定很是难以理解,其他的五大特性如下:每个结点是红的或者黑的根结点是黑的每个叶子结点是黑的如果一个结点是红的,则它的两个儿子都是黑的对每个结点,从该结点到其子孙结点的所有路径上的包含相同数目的黑结点当然面对这样的定义很多人其实会很困惑...,而旋转也有左旋和右旋,而红黑树的很多内容也是基于这两个操作来的。...->key y->key) {y->left = z; //插入左节点} else {y->right = z;}z->left = T->nil; //设置为红色节点z->right = T-...2、当前结点的兄弟结点是黑色的,而且兄弟结点的两个孩子结点都是黑色的这是将兄弟节点和叔父节点设置为红色即可。

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

    函数依赖总结

    对于当前关系r的任意两个元组,如果X值相同,则要求Y值也相同。这种依赖称为函数依赖。记为X->Y, 读作“X决定Y”,或“Y依赖与X”。...如果X->Y 和Y->X同时成立,则可记为XY,也就是在关系中,X和Y具有一一对应关系。 FD的逻辑蕴涵: 逻辑蕴含问题:比如A->B和B->C在关系模式上成立,那么A->C是否成立?...FD的推理规则: 从已知的一些FD,可以推导出另外一些FD,这需要一系列规则。这些规则常被称为“Armstrong"公理。 设U是关系模式R的属性集,F是R上成立的函数依赖集。...传递性:若X->Y和Y->Z在R上成立,则X->Z在R上成立。...合并性:{X->Y, X->Z}  |= X->YZ 分解性:{X->Y, Z⊆Y} |= X->Z 伪传递性:{X->Y, WY->Z} |= WX->Z 复合性:{X->Y, W->Z}  |= XW

    83120

    欧拉角旋转

    实际上,对于夹角的顺序和标记,夹角的两个轴的指定,并没有明确的规定。因此当用到欧拉角时,需要明确地表示出夹角的顺序,指定其参考轴。...然后,绕着Y-轴旋转β角度。 最后,绕着X-轴旋转γ角度。 设任何一点P1在xyz与XYZ坐标系统的坐标分别为r1与R1。...定义Z(α)为绕着Z-轴旋转α角度,Y(β)为绕着Y-轴旋转β角度,X(γ)为绕着X-轴旋转γ角度。则定义A可以表述如下: ?...开始,绕着z-轴旋转α角度。 然后,绕着y-轴旋转β角度。 最后,绕着x-轴旋转γ角度。 设任何一点P2在xyz与XYZ坐标系统的坐标分别为r2与R2。...定义z(α)为绕着z-轴旋转α角度,y(β)为绕着y-轴旋转β角度,x(γ)为绕着x-轴旋转γ角度。则定义B可以表述如下: ? 注意绕大地坐标系旋转是矩阵依次右乘,即z -> y -> x。

    2.9K10

    算法基础:递归

    可以将这个大问题拆解为以下 3 个小问题: 把从小到大的 n-1 个盘子,从 x 移动到 y; 接着把最大的一个盘子,从 x 移动到 z; 最后把从小到大的 n-1 个盘子,从 y 移动到 z。...所以很容易看到汉诺塔问题满足了递归的两个条件: 大问题所化简出来的第 1 个小问题和第 2 个小问题的求解思路和大问题本身完全相同,从而小问题也可以继续化简下去。...在这里,hanio(1, "y", "z", "x") 的执行结果是 "移动: y->x",hanio(1, "x", "y", "z") 的执行结果是 "移动: x->z"。...代码执行的结果就是: 移动: x->z 移动: x->y 移动: z->y 移动: x->z 移动: y->x 移动: y->z 移动: x->z 总结 递归的核心思想是把规模大的问题转化为规模小的相似的子问题来解决...另外这个解决问题的函数必须有明显的结束条件,这样就不会产生无限递归的情况。递归的应用非常广泛,很多数据结构和算法的编码实现都要用到递归,例如分治策略、快速排序等等。

    44420

    关系数据理论

    (也就是说X、Y是Sno、Sname两个属性,U是这个属性组) X函数确定Y 或者 说Y函数依赖于X 记作: X -> Y 非平凡的函数依赖 X -> Y 但是y不属于x, 则称为X-> Y 是非平凡的函数依赖..., Y-/->X, Y->Z, Z不属于Y,则成为Z对X传递函数依赖 记作: X -传递-> Z 码 也就是我们平时所学的键, 只是叫法不同 设K为R中得属性 或者属性组合, 若 K -F...修改复杂 插入异常 删除异常 3NF 设关系模式 R ∈1NF, 如不存在这样的码 X ,属性组 Y 及给主属性Z(Z !∈ Y )使得 X-> Y,Y->Z成立。...X->Y ,Y->Z也就是传递函数依赖,不存在这个传递函数依赖。那么就成立3NF BCNF 设关系模式 R ∈1NF 若 X->Y 且 Y !∈ X时, X必含有码。...以下是一个简单的例子,假设我们有一个名为 sales 的表,其中包含 salesperson 和 sales_amount 两个列。

    12610

    种树:二叉树、二叉搜索树、AVL树、红黑树、哈夫曼树、B树、树与森林

    (第一层)开始,依次向下,获取每一层所有结点的值,有二叉树如下: 实现步骤: 1.创建队列,存储每一层的结点; 2.使用循环从队列中弹出一个结点: 2.1获取当前结点的key; 2.2如果当前结点的左子结点不为空...步骤如下图所示: 第二个图中y的左孩子为T1,第三个图中x和z反了。...= x->right; //令y为旋转点的右子节点 x->right = y->left; //令旋转点的右子节点的左子节点为旋转点的右节点 if(y->left !...= y; else if(x == x->parent->left) x->parent->left = y; else x->parent->right = y; y->left =...= y; else if(x == x->parent->right) x->parent->right = y; else x->parent->left = y; y->right

    1.1K20
    领券