python - 通过循环创建二叉树

标签 python algorithm tree

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

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

我该怎么写?因为我用它来计算所有路径的总和,你如何导航/迭代二叉树:

最佳答案

要从节点值列表构建完整的二叉树(不一定二叉搜索树),我们假设列表中的值根据级别排序-顺序遍历。因此,您的问题列表

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

将代表一棵树:

   1 
 2   3
4 5 6 7

注意根值在位置0,它的左 child 在位置1*2-1=1,右 child 在 1*2=2等。一般来说,对于列表中索引为i的节点,其左子节点位于(i+1)*2-1,右 child 位于 (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]

关于python - 通过循环创建二叉树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44895195/

相关文章:

algorithm - 确定树遍历是广度优先、深度优先还是两者都不是

java - "Simple"Trie实现

python - 在工作事务中执行 db.rollback() 之前是否可以检查数据库更新?

c# - 在字符串中查找重复内容?

python - SQLite 跨具有重复分组行的多列进行 SELECT 查询

string - 在文本中查找字典字符串的最快方法

algorithm - 将给定集合中的最大可能边添加到具有节点容量的图中

algorithm - 我如何根据远亲的种子从其他人的家谱中推断出最亲近的亲戚?

python - 设置在 macOS 上使用 pip 安装 unicorn 的库路径(缺少 libunicorn.dylib)

python - 在 Pyramid 框架中使用 Mysql 和 SqlAlchemy