不同行为递归二叉树输出列表 v. 字符串
Different behavior recursing binary tree to output list v. string
我正在使用 python.
通过二叉树学习递归
我不明白这两个函数输出的差异。在第一个中,我将遍历编码为 return 一个列表,在第二个中是一个字符串。
对于列表:
class Node:
def __init__(self, value):
self.value = value
self.left = None
self.right = None
class Tree:
def __init__(self):
self.root = None
def inorder(self, data, traversal=[]):
if data:
self.inorder(data.left, traversal)
traversal.append(str(data.value))
self.inorder(data.right, traversal)
return traversal
"""
1
/ \
2 3
/ \
4 5
"""
thing = Tree()
thing.root = Node(1)
thing.root.left = Node(2)
thing.root.right = Node(3)
thing.root.left.left = Node(4)
thing.root.left.right = Node(5)
print(thing.inorder(thing.root))
['4', '2', '5', '1', '3']
但是,如果我将 inorder 函数修改为 return 一个字符串:
def inorder(self, data, traversal=""):
if data:
self.inorder(data.left, traversal)
traversal += str(data.value)
self.inorder(data.right, traversal)
return traversal
'1'
只有当我将递归调用的输出分配给遍历时它才有效,如下所示:
def inorder(self, data, traversal=""):
if data:
traversal = self.inorder(data.left, traversal)
traversal += str(data.value)
traversal = self.inorder(data.right, traversal)
return traversal
'42513'
我不明白为什么我追加到列表而不是连接字符串时行为会有所不同。有人可以给我解释一下吗?
python 中的字符串是不可变的。您的遍历累加器依赖于突变来工作。您可以修改它以实际使用 return 值,而不是依赖于改变您的“遍历”数据结构。
if data:
t1 = self.inorder(data.left, "")
t2 = data.value
t3 = self.inorder(data.right, "")
traversal = t1 + t2 + t3
您可以(可能)对列表使用相同的技术。到那时,您将不再需要在递归调用中传递累加器。
我正在使用 python.
通过二叉树学习递归我不明白这两个函数输出的差异。在第一个中,我将遍历编码为 return 一个列表,在第二个中是一个字符串。
对于列表:
class Node:
def __init__(self, value):
self.value = value
self.left = None
self.right = None
class Tree:
def __init__(self):
self.root = None
def inorder(self, data, traversal=[]):
if data:
self.inorder(data.left, traversal)
traversal.append(str(data.value))
self.inorder(data.right, traversal)
return traversal
"""
1
/ \
2 3
/ \
4 5
"""
thing = Tree()
thing.root = Node(1)
thing.root.left = Node(2)
thing.root.right = Node(3)
thing.root.left.left = Node(4)
thing.root.left.right = Node(5)
print(thing.inorder(thing.root))
['4', '2', '5', '1', '3']
但是,如果我将 inorder 函数修改为 return 一个字符串:
def inorder(self, data, traversal=""):
if data:
self.inorder(data.left, traversal)
traversal += str(data.value)
self.inorder(data.right, traversal)
return traversal
'1'
只有当我将递归调用的输出分配给遍历时它才有效,如下所示:
def inorder(self, data, traversal=""):
if data:
traversal = self.inorder(data.left, traversal)
traversal += str(data.value)
traversal = self.inorder(data.right, traversal)
return traversal
'42513'
我不明白为什么我追加到列表而不是连接字符串时行为会有所不同。有人可以给我解释一下吗?
python 中的字符串是不可变的。您的遍历累加器依赖于突变来工作。您可以修改它以实际使用 return 值,而不是依赖于改变您的“遍历”数据结构。
if data:
t1 = self.inorder(data.left, "")
t2 = data.value
t3 = self.inorder(data.right, "")
traversal = t1 + t2 + t3
您可以(可能)对列表使用相同的技术。到那时,您将不再需要在递归调用中传递累加器。