穿过一棵树

时间:2013-04-05 03:14:56

标签: python tree traversal

我想编写一个函数,它返回列表中树中的所有元素。我不允许使用全局变量。这是我试过的:

def traverse(current node):    
    if no left child and no right child:
        return current nodes data
    else:
        if both left child and right child exist:
            return [current nodes data,left_child.traverse(),right_child._traverse()]
        elif no left child:   return [current node's data,right_child.traverse()]
        elif no right child:  return [current node's data,left_child.traverse()]

我们使用了这个例子:(根是2,左子是1,右子是3,右子的右子是4)

    2
1      3
          4

在这棵树上调用遍历返回了这个:

[2, 1, [3, 4]]

所以唯一的问题是我们不能把它全部放在一个列表中。

编辑:以下是一些可以调用的节点函数: node.datanode.leftnode.right

2 个答案:

答案 0 :(得分:1)

您希望传入数组并以递归方式将值附加到数组中,而不是返回值列表:

def traverse(node, arr):
    if node.left:
        traverse(node.left, arr)
    arr.append(node.data)
    if node.right:
        traverse(node.right, arr)
    return arr # this is for convenience so we don't have to store arr

您可以通过以下方式获取列表:

traverse(node, [])

答案 1 :(得分:0)

问题是每个函数调用都在创建一个新列表并将其附加到现有列表。相反,您希望将子节点添加到现有列表中。

这是一个递归解决方案,它不依赖于在调用之间显式传递列表:

def traverse(node):
    if node.left and node.right:
        return [node.data] + traverse(node.left) + traverse(node.right)
    elif node.left:
        return [node.data] + traverse(node.left)
    elif node.right:
        return [node.data] + traverse(node.right)
    else:
        return [node.data]