【发布时间】:2011-04-05 16:50:27
【问题描述】:
我正在尝试简化我的一个作业问题并使代码更好一些。我正在使用的是二叉搜索树。现在我的Tree() 类中有一个函数,它可以找到所有元素并将它们放入一个列表中。
tree = Tree()
#insert a bunch of items into tree
然后我使用我的 makeList() 函数从树中获取所有节点并将它们放入一个列表中。
要调用makeList() 函数,我调用tree.makeList(tree.root)。对我来说,这似乎有点重复。我已经用tree.调用了树对象,所以tree.root只是浪费一点打字。
现在makeList函数是:
def makeList(self, aNode):
if aNode is None:
return []
return [aNode.data] + self.makeList(aNode.lChild) + self.makeList(aNode.rChild)
我想让 aNode 输入一个默认参数,例如 aNode = self.root(这不起作用),这样我就可以使用 tree.makeList() 运行函数。
第一个问题是,为什么这不起作用?
第二个问题是,有没有办法可以工作?如您所见,makeList() 函数是递归的,因此我无法在函数开头定义任何内容,否则会出现无限循环。
编辑 以下是所要求的所有代码:
class Node(object):
def __init__(self, data):
self.data = data
self.lChild = None
self.rChild = None
class Tree(object):
def __init__(self):
self.root = None
def __str__(self):
current = self.root
def isEmpty(self):
if self.root == None:
return True
else:
return False
def insert (self, item):
newNode = Node (item)
current = self.root
parent = self.root
if self.root == None:
self.root = newNode
else:
while current != None:
parent = current
if item < current.data:
current = current.lChild
else:
current = current.rChild
if item < parent.data:
parent.lChild = newNode
else:
parent.rChild = newNode
def inOrder(self, aNode):
if aNode != None:
self.inOrder(aNode.lChild)
print aNode.data
self.inOrder(aNode.rChild)
def makeList(self, aNode):
if aNode is None:
return []
return [aNode.data] + self.makeList(aNode.lChild) + self.makeList(aNode.rChild)
def isSimilar(self, n, m):
nList = self.makeList(n.root)
mList = self.makeList(m.root)
print mList == nList
【问题讨论】:
-
你想在模块级方法中使用“self”做什么?这绝对让人看不到。如果 makeList2() 是类的方法,那么请提供正确的代码,而不是没有上下文的 sn-ps。
-
makeList2() 应该是 makeList(),我编辑了它
-
这怎么没有意义?我试图通过使用树根的默认参数而不是调用它来更简单地使用我的 makeList() 函数。
-
我同意@crh878 的观点,这是有道理的。我自己尝试过,也用于创建二叉搜索树。不开玩笑...
标签: python object recursion tree