data-structures - 为什么我们不在红黑树插入中添加黑色节点而不是红色节点?

标签 data-structures tree red-black-tree clrs

在红黑树插入中,我们总是选择将新节点添加为红色,这样就可以避免改变树的黑色高度。为什么这比添加黑色节点更可取?

最佳答案

我认为这是由于红黑树的规则......

1. A node is either red or black.
2. The root is black.
3. All leaves (NIL) are black.
4. Both children of every red node are black.
5. Every simple path from a given node to any of its descendant leaves contains the same number of black nodes.

在树的底部添加一个插入,用一个带有值和 2 个黑色 nil 子节点的节点替换叶(黑色 nil)节点。规则 5 规定每条路径上黑色节点的数量必须相同。如果添加黑色节点,就会违反此规则。我会尽力说明。

                       B(10)
             R(5)                    B(15) 
    B(1)              B(6)       B(NIL)   B(NIL)
B(NIL) B(NIL)    B(NIL) B(NIL)

你会注意到每条路径上都有 3 个黑色节点。如果您尝试在 15 下插入新节点 16 作为黑色节点(请记住,您在要添加的节点下添加了 2 个黑色 nil 节点),则该路径将变得更长 (4)。像这样是不正确的:

                       B(10)
             R(5)                     B(15) 
    B(1)              B(6)       B(NIL)     B(16)
B(NIL) B(NIL)    B(NIL) B(NIL)          B(NIL) B(NIL)

为了满足所有规则,需要插入一个红色节点,并且每条路径上黑色节点的数量将保持相等。

                       B(10)
             R(5)                     B(15) 
    B(1)              B(6)       B(NIL)     R(16)
B(NIL) B(NIL)    B(NIL) B(NIL)          B(NIL) B(NIL)

关于data-structures - 为什么我们不在红黑树插入中添加黑色节点而不是红色节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14096732/

相关文章:

javascript - 在 Typescript 中将关系数组转换为树对象

algorithm - 寻找 BST 中最大的子树

c++ - 是否有用于硬盘存储而不是内存的多索引容器?

algorithm - 一个红黑案例问题

c# - 如何使用字符串列表进行查找?

java - 我应该在java中使用哪种数据结构来存储重复值?

algorithm - 查找二叉堆的最后一个元素

java - 关联数组的实现

java - 什么时候使用哈希表?

data-structures - 纯函数映射和集合的统计性能