chr*_*nze 52 python tree recursion object
嘿大家好,我正在努力简化我的一个作业问题并使代码更好一些.我正在使用的是二叉搜索树.现在我在我的Tree()
类中有一个函数,它找到所有元素并将它们放入列表中.
tree = Tree()
#insert a bunch of items into tree
Run Code Online (Sandbox Code Playgroud)
然后我使用我的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)
Run Code Online (Sandbox Code Playgroud)
我想让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
Run Code Online (Sandbox Code Playgroud)
nof*_*tor 44
拉尔曼斯回答了你的第一个问题
对于你的第二个问题,你可以在跳跃之前简单地看一下以避免递归吗?
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
Run Code Online (Sandbox Code Playgroud)
Fre*_*Foo 36
它不起作用,因为默认参数是在函数定义时计算的,而不是在调用时:
def f(lst = []):
lst.append(1)
return lst
print(f()) # prints [1]
print(f()) # prints [1, 1]
Run Code Online (Sandbox Code Playgroud)
常见的策略是使用None
默认参数.如果None
是有效值,请使用单例标记:
NOTHING = object()
def f(arg = NOTHING):
if arg is NOTHING:
# no argument
# etc.
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
22697 次 |
最近记录: |