附加(自已)Python类中的堆栈

时间:2019-05-03 19:26:07

标签: python oop data-structures

我正在/正在学习数据结构和算法,并且遇到了以下代码:

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代表该类的实例。

1 个答案:

答案 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放在堆栈上,允许在最终返回到根节点并移到其右子节点之前先处理左子节点(及其后代)。