发现了一个错误,修复了它,我不明白它为什么会被窃听?

时间:2018-04-24 09:37:25

标签: python-3.x recursion binary-tree tree-traversal postfix-notation

我遇到了一个现已修复的错误,但我仍然不明白它的根本原因。

我想做什么:

使用后序树遍历从二叉树中获取后缀表达式。此表达式将作为列表对象返回,例如: 给出

的表达式树
"((a+1)+1)"

我希望我的函数返回以下列表:

 ["a","1","+","1","+"]

我遇到的问题:

连续几次使用我的函数(称为postfix)只是将最新列表“添加”到之前的列表中。这是我给出

的表达式树的意思
"((a+1)+1)"

写作

 postfix( BinaryTree of "((a+1)+1)")     

将返回

 ["a","1","+","1","+"]

再次在同一棵树上调用该函数将返回

["a","1","+","1","+","a","1","+","1","+"]

有人可以向我解释为什么会这样吗?这是我的其余代码

class BinaryTree:
    def __init__(self,rootVal,leftBinaryTree=None,rightBinaryTree=None):
        self.key = rootVal
        self.left = leftBinaryTree
        self.right = rightBinaryTree
    def getRootVal(self):
        return self.key
    def getLeftChild(self):
        return self.left
    def getRightChild(self):
        return self.right

""" Tree Traversal """


def postorder(tree):
    if tree != None:
        postorder(tree.getLeftChild())
        postorder(tree.getRightChild())
        print(tree.getRootVal())

""" posfix from tree """                         


def postfix(tree,stack = []):
    if tree!=None:
        postfix(tree.getLeftChild(),stack)
        postfix(tree.getRightChild(),stack)
        stack.append(tree.getRootVal())
    return stack

expression = "((a+1)+1)"
tree = BinaryTree("+",BinaryTree("+",BinaryTree("a"),BinaryTree("1")),BinaryTree("1"))

print(postfix(tree))
print(postfix(tree))
print(postfix(tree))

使用以下输出

['a', '1', '+', '1', '+']
['a', '1', '+', '1', '+', 'a', '1', '+', '1', '+']
['a', '1', '+', '1', '+', 'a', '1', '+', '1', '+', 'a', '1', '+', '1', '+'

我在写出来的时候发现了明确使用

postfix(tree,[])

似乎解决了这个问题。有人能告诉我问题是什么,以后我可以避免它吗?

1 个答案:

答案 0 :(得分:0)

在所有3个postfix()调用中,

stack []存在于内存中。 因此,每次使用append()时,只需将根添加到堆栈列表中。

如果您观察输出的第2行和第3行,这很明显。' a',' 1',' +',' 1',' +'在第一行中出现一次,在第二行中出现两次,在第三行中出现三次。 如果您是第四次再次拨打该方法,请'' 1',' +',' 1',&# 39; +'将在堆栈中重复4次。