【问题标题】:returns the preorder list of a tree in python在 python 中返回树的预排序列表
【发布时间】:2015-10-04 17:33:20
【问题描述】:

我是 python 新手,正在尝试编写一个函数,该函数将递归地返回树的预排序列表。我可以得到它来获取预购列表,但是,它带有大量来自与基本案例的递归交互的不需要的空列表。

代码是:

def BinPreOrder(T):
    if Is_EmptyBinTree(T):
        return []
    else:
        return BinRoot(T), BinPreOrder(Left(T)), BinPreOrder(Right(T))

如何获得仅包含每个节点值的列表的输出(没有空列表等)?

非常感谢,

【问题讨论】:

  • return [] 导致了问题。只需使用if not Is_EmptyBinTree(T):...

标签: python tree return empty-list preorder


【解决方案1】:

我假设您想要一个平面列表,而不是一个元组作为您的答案。第一个问题是

BinRoot(T), BinPreOrder(Left(T)), BinPreOrder(Right(T))

是一个包含三个元素的元组,而不是一个列表。递归调用也将返回元组,因此您将结束一个元组。

第二个问题是您的结果中所有出现的None。正如一些人已经指出的那样,python 函数默认情况下总是返回 None,所以你必须明确避免 None's。

试试这样的:

def BinPreOrder(T):
    if not Is_EmptyBinTree(T):
        answer = [BinRoot(T)] 
        left = BinPreOrder(Left(T))
        if left is not None:
           answer.extend(left) 
        right = BinPreOrder(Right(T))
        if right is not None:
           answer.extend(right)
        return answer

编辑:有一种更短、更清晰的方法可以做到这一点。不要让它为空子树返回 None ,而是让它返回一个空列表。然后你可以连接三个列表。我专注于解决您的代码问题,而不是考虑问题本身。对不起

def BinPreOrder(T):
    if Is_EmptyBinTree(T): return []
    return [BinRoot(T)] + BinPreOrder(Left(T)) + BinPreOrder(Right(T))

【讨论】:

    【解决方案2】:

    只需使用not 运算符来反转您的Is_EmptyBinTree(T) 的结果:

    def BinPreOrder(T):
        if not Is_EmptyBinTree(T):
            return BinRoot(T), BinPreOrder(Left(T)), BinPreOrder(Right(T))
    

    如果没有明确返回其他值,所有函数都返回 None

    【讨论】:

    • 感谢您的回答。但是,这似乎返回了一个包含许多 None 的元组。这就是我得到的:(3, (1, None, (2, None, None)), (4, None, (6, None, None)))
    • @user5407287 期望的输出是什么,您的输入是什么?你应该更好地构建你的问题,当我们只知道你不想要空列表时,很难给你想要的东西。
    • 如果可能的话,我正在尝试获取仅包含每个节点的值的预排序列表的输出。非常感谢您的帮助。
    • @user5407287 你能举几个例子输入和输出吗?
    • 我输入了一个值为 3,4,1,2,6 的 bst 并退出 (3, (1, None, (2, None, None)), (4, None, (6, None, None)))
    【解决方案3】:

    制作一个列表并递归返回。

    def BinPreOrder(T):
        ans=[]
        if T is not None:
            ans.append(T.val)
            ans.extend(BinPreOrder(T.lelt))
            ans.extend(BinPreOrder(T.right))
        return ans
    

    【讨论】:

      猜你喜欢
      • 2018-08-10
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      • 1970-01-01
      • 2021-09-14
      • 1970-01-01
      • 2016-11-15
      相关资源
      最近更新 更多