伙计我正在尝试为红黑树实施删除算法,而我在理解该算法的第三行时遇到问题(来自“算法导论”第二版):
1如果左[z] = nil [T]或右[z] = nil [T]
2然后y←z
3否则y←TREE-SUCCESSOR(z)
4如果左[y]≠nil [T]
5然后x←left [y]
6其他x←右[y]
7 p [x]←p [y]
8如果p [y] = nil [T]
9然后根[T]←x
10否则如果y = left [p [y]]
11然后离开[p [y]]←x
12其他正确[p [y]]←x
13如果y 3≠z
14然后键[z]←键[y]
15将y的卫星数据复制到z
中
如果颜色[y] =黑色,则为16
17然后RB-DELETE-FIXUP(T,x)
18返回y
首先,本书中没有任何地方解释了TREE-SUCCESSOR看起来是什么样的(没有算法),但我发现了this page:如果我用这个算法喂11,2,1 ,7,5,8,14,15,4,然后尝试删除7它找到前任,但如果我尝试删除11,它会找到后继者。那是我无法理解的。为什么有时需要前任,有时需要后继者?做出此决定时会考虑哪些标准?节点的颜色?
谢谢。
P.S。我也不太明白它是用第13行写的。这是否意味着如果你有三种颜色(既不是黑色也不是红色)或其他什么颜色?
答案 0 :(得分:1)
树继承者(与树的前身相反[在我认为的那本书中])通常被定义为二进制搜索树作为具有下一个最高密钥的节点。它如何决定它取决于类型(在这种情况下为红黑),而且我几乎是正面的,你的书将继承方法作为练习。 (我记得问题:P)
答案 1 :(得分:1)
我想你正在阅读CLRS第2版。
TREE-SUCCESSOR在第12章第2节 - “12.2查询二进制搜索树”中介绍。与Jesse Naugher所说的相反,它不依赖于二叉搜索树的类型。
你引用的第13行是拼写错误。它应该是“if y!= z”。
答案 2 :(得分:0)