【问题标题】:Construct complete binary tree from preorder traversal list Python从前序遍历列表Python构造完整的二叉树
【发布时间】:2016-02-20 05:53:10
【问题描述】:

如何仅使用内置列表从 Python 中的预排序列表构建二叉树(不是二叉搜索树)?预购清单中的每个节点还有一个“标志”,显示它是叶节点还是内部节点。并且每个节点有 2 个孩子(没有 0 或 1 个孩子)

我创建了一个类来表示一个节点

class Node:
    def __init__(self, initType):
        self.type = initType
        self.leftChild = None
        self.rightChild = None

我想我应该在这里使用stack,但我不想importstack 库。

我在网上找到的解决方案仅适用于 BST,或者输入由一个中序列表和一个预购列表组成,而不仅仅是预购列表。

【问题讨论】:

  • 没有任何“相关”问题有帮助吗? FWIW,您可以使用标准 list 作为 LIFO 堆栈:使用 .append 方法将项目推送到列表中,并使用 .pop 方法将其再次弹出。
  • 或者您可以跳过整个 Node 类并在有序列表上使用索引数学来获取所需的节点。 IE。根节点将是元素 0,根 1 的左孩子,根 2 的右孩子,元素 n - 2*n + 1 的左孩子,元素 n - 2*n + 2 的右孩子。如果孩子的索引更多大于列表的大小,则该子项不存在。
  • 这里的预序是指预序遍历,不是预排序列表。
  • 这种类型的树称为complete binary tree(正好有两个节点),请编辑您的问题以指定它。
  • 我同意 PM 2Ring,为什么不直接使用 list 作为 LIFO 堆栈?

标签: python binary-tree


【解决方案1】:

仅给定前序遍历,您无法唯一地重新创建二叉树。这就是为什么您在网上找到的解决方案是针对 BST 的,或者也提供了有序列表。

例如,如果预购列表为 [1, 2, 3]

那么你原来的二叉树可能是:

         1
       /
     2
   /
  3

也可以是:

1
  \
   2
    \
     3 

** 注意它们是不同的树,但具有相同的前序遍历列表!

如果在采访中问到这个问题,是想看看你是否会注意到无法实现唯一二叉树的事实,并澄清这个问题:“二叉树是二叉搜索树吗?”

在面试中,为了让你提问而忽略问题中的事实是很常见的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 2021-03-08
    相关资源
    最近更新 更多