我尝试在插入的每个步骤后打印二进制搜索树的每个阶段。但是,我的代码生成的输出似乎错过了初始根数据插入步骤,并且还重复了某些阶段。我需要一个干净简单的方法来做到这一点。有没有办法使用__dict__.values()
来做到这一点。
我的代码:
class Node:
def __init__(self, data):
self.data = data
self.left = None
self.right = None
def addNode(self, data):
if data < self.data:
if self.left is None:
self.left = Node(data)
else:
self.left.addNode(data) # recursively calling addNode method
else:
if self.right is None:
self.right = Node(data)
else:
self.right.addNode(data)
if not self.left is None and not self.right is None:
print self.left.data, self.data, self.right.data
elif self.left is None and not self.right is None:
print None, self.data, self.right.data
elif not self.left is None and self.right is None:
print self.left.data, self.data, None
if __name__ == '__main__':
n = Node(5)
#print n.__dict__.values()
n.addNode(3)
n.addNode(2)
n.addNode(8)
n.addNode(4)
输出已生成:
3 5 None
2 3 None
3 5 None
3 5 8
2 3 4
3 5 8
预期输出:
None 5 None
3 5 None
2 3 None
3 5 8
2 3 4
答案 0 :(得分:1)
由于您的设计方式,打印步骤发生在每个递归步骤,从内到外。因此,为了更有意义,让我们来看看。您n.addNode(3)
给了我们
3 5 None
没有惊喜。但是当你说你期待的时候:
2 3 None
但得到两者,
2 3 None
3 5 None
因为n.addNode(2)
要检查第一级(3 5 None
)然后查看较低级别(data
属性= 3
的节点)。因此,“从内到外”打印,我们再次获得2 3 None
(新子树),然后再获得第一级3 5 None
。它的原因与你预期的一样,
2 3 4
你反而得到,
2 3 4
3 5 8
初始树(您期望None 5 None
)未打印的事实是一个单独的问题。这只是因为您正在初始化data
属性,并且因为您没有调用addNone
而无法访问打印部分。
可能的解决方案(仍然维护您的结构)将仅在您将节点添加到树结构并手动打印初始子树时进行打印。也许写下这样的东西:
class Node:
def __init__(self, data):
self.data = data
self.left = None
self.right = None
def addNode(self, data):
if data < self.data:
if self.left is None:
self.left = Node(data)
self.printSubtree()
else:
self.left.addNode(data) # recursively calling addNode method
else:
if self.right is None:
self.right = Node(data)
self.printSubtree()
else:
self.right.addNode(data)
def printSubtree(self):
if not self.left is None and not self.right is None:
print self.left.data, self.data, self.right.data
elif self.left is None and not self.right is None:
print None, self.data, self.right.data
elif not self.left is None and self.right is None:
print self.left.data, self.data, None
else:
print None, self.data, None
if __name__ == '__main__':
n = Node(5)
n.printSubtree()
n.addNode(3)
n.addNode(2)
n.addNode(8)
n.addNode(4)
答案 1 :(得分:0)
1-您在添加节点后打印,因此您无法找到具有None,Number,None的元素(因此请在添加节点之前尝试移动此部分)。 2-打印时你只考虑了三种可能性,但还有另外一种,当左边和右边的节点都是None时,尝试添加它。