【问题标题】:Creating a binary tree through a loop通过循环创建二叉树
【发布时间】:2017-12-07 06:58:22
【问题描述】:

我想通过循环来创建一棵二叉树。我知道如何编写一个非常基本的二叉树。

class Tree(object):
    def __init__(self):
        self.left = None
        self.right = None
        self.data = None


root = Tree()
root.data = 75
root.left = Tree()
root.left.data = 95
root.right = Tree()
root.right.data = 64

root.left.left = Tree()
root.left.left.data = 32
root.left.right = Tree()
root.left.right.data = 93
root.left.left = Tree()
root.right.left.data = 32
root.left.right = Tree()
root.right.right.data = 93

print(root.data)

手动打字很乏味,如果我有一个数字列表:

list = [1,2,3,4,5,6,7]

并通过一个循环来按这个顺序创建一个二叉树:

   1 
 2   3
4 5 6 7

我该怎么写呢?并且因为我使用它来计算所有路径的总和,你如何导航/遍历二叉树:

【问题讨论】:

  • 节点 5 属于节点 2 还是节点 3,还是同时属于它们?
  • this 相关。虽然不是一个完整的副本,因为 OP 希望自动化创建树的过程。
  • 您需要跟踪当前树的高度。
  • @juanpa.arrivillaga 抱歉,我不明白什么是节点。我对二叉树很陌生。
  • @PoChenLiu 节点 = 树中的一个数字。

标签: python algorithm tree


【解决方案1】:

要从节点值列表构建完整的二叉树不一定二叉搜索树),我们假设列表中的值按照级别排序 -顺序遍历。所以,你的问题列表

values = [1,2,3,4,5,6,7]

将代表一棵树:

   1 
 2   3
4 5 6 7

注意根值在0的位置,它的左孩子在1*2-1=1的位置,右孩子在1*2=2的位置,等等。通常对于索引i的列表中的节点,它的左孩子在位置(i+1)*2-1,右孩子在(i+1)*2

现在,我们只需逐个节点递归地构建树,在每一步创建左子树和右子树。

为了简单起见,我们假设values 的列表是全局的。

class Node(object):
    def __init__(self, data=None, left=None, right=None):
        self.data = data
        self.left = left
        self.right = right

def buildTree(i):
    if i < len(values):
        return Node(values[i], left=buildTree((i+1)*2-1), right=buildTree((i+1)*2))

values = [1,2,3,4,5,6,7]
tree = buildTree(0)

要打印树,我们可以使用preorder tree traversal:

def preorder(node):
    if node is None:
        return
    yield node.data
    for v in preorder(node.left):
        yield v
    for v in preorder(node.right):
        yield v

像这样:

>>> print list(preorder(tree))
[1, 2, 4, 5, 3, 6, 7]

【讨论】:

  • 如果我让节点 5 由 2 和 3 共享,我会怎么做?
  • 你能举个例子说明你的意思吗?如果您希望节点 (5) 有 两个父节点(上面的 2 和 3),那么您需要一个通用的 graph,而不是 tree(这是一种特殊类型的图)。
猜你喜欢
  • 2017-07-01
  • 1970-01-01
  • 2015-05-16
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多