Inorder二叉树遍历(使用Python)

时间:2017-01-12 20:15:50

标签: python list binary-tree inorder

我正在尝试执行树的顺序遍历。代码本身感觉正确,除非它不能正常工作。我有一种感觉,它必须与if条件,如何附加在python中工作,或者可能与返回。如果我使用print而不是return,这可以正常工作,我想,但我希望能够使用return并仍然得到正确的答案。例如,对于树[1,None,2,3],我的代码返回[1],这显然是不正确的。

另外可以使用列表解析来解决这个问题吗?如果是这样,我们将非常感谢任何示例代码。

这是我的代码:

SCREENCAPTUREDLL_API void getAudioDeviceList(wchar_t*** listRef, int* listSize)
{
    ...
    *listRef = &descriptionList[0];
}

同样在将此标记为重复之前,我知道在Stackoverflow上已经询问了遍历(很多次),但是没有一个帮助我理解为什么我的理解是错误的。如果有人帮助我学习如何纠正我的方法而不是简单地发布另一个没有解释的链接,我将非常感激。非常感谢你!

3 个答案:

答案 0 :(得分:7)

这不起作用的原因是res只有你给它附加的第一个节点的值;每次递归调用该函数时,它只会生成一个新的res。这是一个简单的解决方法,如下所示:

class Solution(object):
    def inorderTraversal(self, root):
        res = []
        if root:
            res = self.inorderTraversal(root.left) 
            res.append(root.val)
            res = res + self.inorderTraversal(root.right)
        return res

在此,它返回左分支,值,然后返回右。这可以简单地做到如下:

class Solution(object):
    def inorderTraversal(self, root):
        return (self.inorderTraversal(root.left) + [root.val] + self.inorderTraversal(root.right)) if root else []

答案 1 :(得分:2)

使用它来代替一个简单的递归::

class Node:
    def __init__(self,key):
        self.left = None
        self.right = None
        self.val = key

def printInorder(root):
    if root:
        printInorder(root.left)
        print(root.val)
        printInorder(root.right)

def printPostorder(root):
    if root:
        printPostorder(root.left)
        printPostorder(root.right)
        print(root.val)

def printPreorder(root):
    if root:
        print(root.val)
        printPreorder(root.left)
        printPreorder(root.right)

# Driver code
root = Node(1)
root.left      = Node(2)
root.right     = Node(3)
root.left.left  = Node(4)
root.left.right  = Node(5)
print "Preorder traversal of binary tree is"
printPreorder(root)

print "\nInorder traversal of binary tree is"
printInorder(root)

print "\nPostorder traversal of binary tree is"
printPostorder(root)

来源:: here

答案 2 :(得分:0)

@Benedict Randall Shaw的答案已经很完美了。我只想以pythonic的方式为其添加一些乐趣。尽管doc不建议使用可变对象作为默认参数,但是通过将默认可变list视为python函数的类成员,这将在某种程度上简化代码。

区别在于仅将+=替换为=,因为在函数对象被垃圾回收之前,res在函数内部始终是相同的list对象。

def inorderTraversal(root, res=[]):
    if root:
        res = inorderTraversal(root.left)
        res.append(root.val)
        res = inorderTraversal(root.right)
return res