我正在/正在学习数据结构和算法,并且遇到了以下代码:
class BinaryTree:
def __init__(self, root_data):
self.data = root_data
self.left_child = None
self.right_child = None
def inorder_iterative(self):
inorder_list = []
return inorder_list
def get_right_child(self):
return self.right_child
def get_left_child(self):
return self.left_child
def set_root_val(self, obj):
self.data = obj
def get_root_val(self):
return self.data
def preorder_iterative(self):
pre_ordered_list = [] #use this as result
stack = []
stack.append(self)
while len(stack)>0:
node = stack.pop() #should return a value
pre_ordered_list.append(node.get_root_val())
if node.right_child:
stack.append(node.get_right_child())
if node.left_child:
stack.append(node.get_left_child())
return pre_ordered_list
bn = BinaryTree(1)
bn.left_child = BinaryTree(2)
bn.right_child = BinaryTree(3)
print (bn.preorder_iterative())
我对stack.append(self)
部分感到非常迷茫。我不确定使用此行的目的是什么,并且我不完全了解.append(self)
的概念。我了解到self
代表该类的实例。
答案 0 :(得分:1)
堆栈的目的是模拟递归。
放置在堆栈上的初始值是树本身(以其根节点的形式)。检索其值,然后将每个子树放在堆栈上。在循环的下一次迭代中,左子级将被删除,处理,并替换为 its 子级(如果有)。只要堆栈上有任何要处理的内容,循环就会继续。处理完树左侧的所有内容之后,您最终将从正确的子节点开始(将堆栈放置在循环的开头)。
与递归版本比较:
def preorder_recursive(self):
result = [self.get_root_val()]
if node.left_child:
result.extend(node.left_child.preorder_recursive())
if node.right_child:
result.extend(node.right_child.preorder_recursive())
return result
每个递归调用实际上将self
放在堆栈上,允许在最终返回到根节点并移到其右子节点之前先处理左子节点(及其后代)。