我正在尝试简化我的作业问题之一,并使代码更好一点。我正在使用的是二进制搜索树。现在,我的Tree()班级中有一个函数可以查找所有元素并将它们放入列表中。
Tree()
tree = Tree() #insert a bunch of items into tree
然后我使用makeList()函数从树中取出所有节点,并将它们放入列表中。要调用该makeList()函数,我要做tree.makeList(tree.root)。对我来说,这似乎有些重复。我已经用调用了树对象,tree.所以tree.root只是浪费了一点输入。
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()。
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
拉尔斯曼人回答了您的第一个问题
它不起作用,因为默认参数是在函数定义时而不是在调用时求值的:
def f(lst = []): lst.append(1) return lst print(f()) # prints [1] print(f()) # prints [1, 1]
常见的策略是使用None默认参数。如果None是有效值,请使用单例哨兵:
NOTHING = object() def f(arg = NOTHING): if arg is NOTHING: # no argument # etc.
对于第二个问题,您能否在跳转之前简单地看一下以避免递归?
def makeList(self, aNode=None): if aNode is None: aNode = self.root treeaslist = [aNode.data] if aNode.lChild: treeaslist.extend(self.makeList(aNode.lChild)) if aNode.rChild: treeaslist.extend(self.makeList(aNode.rChild)) return treeaslist