Python 从前序遍历列表构造完整的二叉树

Python 从前序遍历列表构造完整的二叉树,python,binary-tree,Python,Binary Tree,如何仅使用内置列表从Python中的预排序列表构造二叉树(而不是二叉搜索树)?预排序列表中的每个节点都有一个“标志”,显示它是叶节点还是内部节点。每个节点有2个子节点(没有0或1个子节点) 我创建了一个类来表示一个节点 class Node: def __init__(self, initType): self.type = initType self.leftChild = None self.rightChild = None 我想我

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

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

class Node:
    def __init__(self, initType):
        self.type = initType
        self.leftChild = None
        self.rightChild = None
我想我应该在这里使用
堆栈
,但我不想
导入
堆栈


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

如果只提供预排序遍历,则无法唯一地重新创建二叉树。这就是为什么您在网上找到的解决方案是针对BST的,或者也提供了订单列表

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

那么您的原始二叉树可以是:

         1
       /
     2
   /
  3
1
  \
   2
    \
     3 
或者可以是:

         1
       /
     2
   /
  3
1
  \
   2
    \
     3 
**请注意,它们是不同的树,但具有相同的预顺序遍历列表

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


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

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

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

那么您的原始二叉树可以是:

         1
       /
     2
   /
  3
1
  \
   2
    \
     3 
或者可以是:

         1
       /
     2
   /
  3
1
  \
   2
    \
     3 
**请注意,它们是不同的树,但具有相同的预顺序遍历列表

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


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

难道这些“相关”问题都没有帮助吗?FWIW,您可以使用标准的
列表
作为后进先出堆栈:使用
.append
方法将项目推送到列表上,然后使用
.pop
方法将其再次弹出。或者您可以跳过整个节点类,在有序列表上使用索引数学来获得所需的节点。即根节点将是元素0,根1的左子节点,根2的右子节点,元素n-2*n+1的左子节点,元素n-2*n+2的右子节点。如果子级的索引大于列表的大小,则该子级不存在。这里的预排序是指预排序遍历,而不是预排序列表。这种类型的树称为
完全二叉树
(正好有两个节点),请编辑您的问题以指定此项。我同意PM 2Ring,为什么不直接使用充当后进先出堆栈的
list
?任何“相关”问题都没有帮助吗?FWIW,您可以使用标准的
列表
作为后进先出堆栈:使用
.append
方法将项目推送到列表上,然后使用
.pop
方法将其再次弹出。或者您可以跳过整个节点类,在有序列表上使用索引数学来获得所需的节点。即根节点将是元素0,根1的左子节点,根2的右子节点,元素n-2*n+1的左子节点,元素n-2*n+2的右子节点。如果子级的索引大于列表的大小,则该子级不存在。这里的预排序是指预排序遍历,而不是预排序列表。这种类型的树称为
完全二叉树
(正好有两个节点),请编辑您的问题以指定此项。我同意PM 2Ring,为什么不直接使用充当后进先出堆栈的
list