【问题标题】:How to construct level order traversal using preorder and inorder traversal.(Without constructing a tree)如何使用前序和中序遍历构造水平顺序遍历。(不构造树)
【发布时间】:2021-03-24 10:37:17
【问题描述】:

inorder = [1,2,3,4,5,7,6,8,9,10,11,12,13,14,15]

这是中序遍历。

  • 正如 trinkot 在 cmets 中所说,我们不能仅使用中序遍历来构造二叉树。让我们假设还给出了任何随机的前序遍历。我们如何在不创建树的情况下找到级别顺序遍历。

我想要这样的关卡顺序遍历。

levelorder = [8,4,12,2,6,10,14,1,3,5,7,9,11,13,15]

我想过使用递归函数,比如

def rec(lis):
    if(len(lis)<1):
        return
    mid = len(lis)//2
    root = lis[math.ceil(mid)]
    array.append(lis[root])
    rec(lis[0:mid])
    rec(lis[mid+1:])

但这不起作用,因为第二次递归调用仅在所有第一次递归调用结束后发生。 有没有办法让我交替调用第一个和第二个递归调用?

或者有没有另一种方法可以在不构造树的情况下找到树的级别顺序遍历?

【问题讨论】:

  • 如果你只有中序遍历作为输入,那么你并不真正知道树的形状是什么(有许多不同的树具有相同的中序序列)。所以这是不可能的,或者说:可能有许多不同的答案都可能是正确的。
  • 哦...好吧。假设我们也有一个前序遍历,那么我们如何在不创建另一棵树的情况下找到水平顺序遍历。有可能吗?
  • 您应该编辑您的问题,并请展示您为与更改后的问题保持一致所做的努力。

标签: python algorithm tree-traversal


【解决方案1】:

当然,为什么不呢? 这不是最有效的实现,但适当的数据结构支持会使其达到渐近最优。

def level_order(pre_order):
    path = []
    levels = []
    for x in pre_order:
        while path and any(path[-1] < y < x for y in path):
            del path[-1]
        path.append(x)
        while len(levels) < len(path):
            levels.append([])
        levels[len(path) - 1].append(x)
    return [x for level in levels for x in level]


print(level_order([8, 4, 2, 1, 3, 6, 5, 7, 12, 10, 9, 11, 14, 13, 15]))

【讨论】:

  • 每棵树都是具有正确比较器的 BST。
  • 当然,但是 OP 没有给出比较器作为输入。只是预购序列。
  • 我很乐意假设这棵树是 BST。这将解决我的问题。谢谢你:)
猜你喜欢
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-06
  • 1970-01-01
  • 2014-12-30
  • 2011-07-09
相关资源
最近更新 更多