LEFT-ROTATE(T, x)
y = x.right # Line 1
x.right = y.left # Line 2
if y.left ? T.nil # Line 3
y.left.p = x # Line 4
y.p = x.p
if x.p == T.nil
T.root = y
elseif x == x.p.left
x.p.left = y
else x.p.right = y
y.left = x
x.p = y
Run Code Online (Sandbox Code Playgroud)
其中.left,.right,.p属性分别与其左,右子级及其父级相对应。T是树。
我的主要问题在于第3行和第4行:
为什么我需要第3行的if条件?这本书说NIL实际上是红黑树的叶子,因此我认为NIL也可以有父指针。这些代码在没有第3行的情况下仍然可以使用。
通过1号线和2号线,我可以将4号线写为x.right.p = x吗?如果它们实际上是相同的,那么作者是否有理由选择将其写为y.left.p = x?
我的直觉是x.right.p = x与y.left.p = x。但是,我对此找不到很好的解释。我已经检查了指针的定义,但是在谷歌搜索很多之后,它仍然很令人困惑。
我正在练习以下代码:
class MITPerson(Person): # a subclass of class Person
nextIdNum = 0 # identification number
def __init__(self, name):
Person.__init__(self, name)
self.idNum = MITPerson.nextIdNum
MITPerson.nextIdNum += 1
def getIdNum(self):
return self.idNum
Run Code Online (Sandbox Code Playgroud)
作为参考,这里是超类:
class Person(object): # superclass
def __init__(self, name):
"""Create a person"""
self.name = name
Run Code Online (Sandbox Code Playgroud)
我以为我已经知道了这个问题的答案,因为我尝试了以下实例:
p1 = MITPerson('Mark Guttag')
p2 = MITPerson('Billy Bob Beaver')
p3 = MITPerson('Billy Bob Beaver')
Run Code Online (Sandbox Code Playgroud)
毫不奇怪,当我将它们输入控制台时:
在[12]中:p1.getIdNum()
出[12]:0
在[13]中:p3.getIdNum()
出[13]:2
我已经阅读了这篇文章,并在这里检查了所有优秀答案: Python中的静态类变量
我看到在创建第一个实例p1时,nextIdNum被赋值为0.我觉得奇怪的是,为什么p2和p3还没有将nextIdNum再次绑定到0?在我的想象中,一旦创建了类MITPerson而不调用该方法,就应该将类变量重新赋值为0.
我错过了什么?
顺便说一句,我也在这里阅读教程:https: //docs.python.org/3.6/tutorial/classes.html#class-objects
但是,我担心它没有给出答案:(