如何理解二叉树中的以下递归函数?

时间:2016-04-23 03:19:14

标签: python python-3.x recursion binary-tree binary-search-tree

以下是二进制搜索功能(根有左右孩子),我不太了解。在代码中,它返回一个列表,该列表是二叉树中最长的路径。但是对于这部分: return_path_left = list_longest_path(node.left) return_path_right = list_longest_path(node.right) if len(return_path_left) > len(return_path_right):

你怎么比较两个递归调用?例如,如果树是

1 / \ 2 list_longest_path(node.right)肯定会返回[]。但是,如何将list_longest_path(2)[]进行比较?

有人帮助会很棒。

def list_longest_path(node):
    """
    List the data in a longest path of node.

    @param BinaryTree|None node: tree to list longest path of
    @rtype: list[object]

    >>> list_longest_path(None)
    []
    >>> list_longest_path(BinaryTree(5))
    [5]
    >>> b1 = BinaryTree(7)
    >>> b2 = BinaryTree(3, BinaryTree(2), None)
    >>> b3 = BinaryTree(5, b2, b1)
    >>> list_longest_path(b3)
    [5, 3, 2]
    """
    if node is None:
        return []
    else:
        return_path_left = list_longest_path(node.left)
        return_path_right = list_longest_path(node.right)
        if len(return_path_left) > len(return_path_right):
            return [node.data] + return_path_left
        else:
            return [node.data] + return_path_right

1 个答案:

答案 0 :(得分:1)

  

list_longest_path(node.right)肯定会返回[]。但你好吗?   将list_longest_path(2)与[]?

进行比较

当遇到类似list_longest_path(2)的递归调用时,它会被推送到调用堆栈。由于调用堆栈是一个堆栈[并因此在最后输出],因此暂停当前堆栈帧并评估list_longest_path(2)。

list_longest_path(2)的评估如下:

由于左右节点均为None,因此return_path_left = []; return_path_right = [];所以list_longest_path(2)= [2] + [] = [2]

然后从堆栈中弹出list_longest_path(2)堆栈帧,程序在前一个堆栈帧中继续执行。我们现在有一个list_longest_path(2)= [2]的简单值 然后我们完成了这个函数len([2])>的执行。 len([])so list_longest_path(1)= [1] + [2] = [1,2]