Python 构建高度为30的完美二叉树

Python 构建高度为30的完美二叉树,python,algorithm,performance,binary-tree,graph-algorithm,Python,Algorithm,Performance,Binary Tree,Graph Algorithm,我正试图建立一个高度为30的完美二叉树。它不一定是BST,只是一棵普通的树;数据也不重要,因此每个节点的数据都可以为null。我以前从未尝试过这样做,所以当我创建此树的方法导致疯狂的内存使用并在运行几分钟后开始锁定我的计算机时,我有点沮丧。下面是我构建树的Python代码: class Node: def __init__(self, val): self.left = None self.right = None self.data =

我正试图建立一个高度为30的完美二叉树。它不一定是BST,只是一棵普通的树;数据也不重要,因此每个节点的数据都可以为null。我以前从未尝试过这样做,所以当我创建此树的方法导致疯狂的内存使用并在运行几分钟后开始锁定我的计算机时,我有点沮丧。下面是我构建树的Python代码:

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

def build_tree(h):
    node = Node(0)
    if h == 1:
        return node
    node.left = build_tree(h-1)
    node.right = build_tree(h-1)
    return node

root = build_tree(30)
可能值得一提的是,我也尝试过使用列表表示。不幸的是,这种大小的列表的内存使用也是有问题的


有谁能解释一种不需要占用太多内存,并且可以在合理时间内完成的方法吗?

在一个完美的二叉树中,每一级的节点数量都是原来的两倍。具有
n
级别的二叉树中的节点总数为
2**n-1
。这意味着一个完美的二叉树有30个级别

1073741823

节点。这将导致“疯狂的内存使用”,除非你重复节点,这是一个“完美的二叉树”


您所能做的最好是为每个节点使用尽可能少的内存量。我能想到的最好方法是使用完整二叉树的列表表示法——索引
j
处节点的子节点位于索引
2*j
2*j+1
处,父节点位于索引
j//2
。这意味着您不需要存储指向子节点或父节点的指针或索引。最后,使用占用尽可能少内存的列表。t每个项目仅使用一个字节。这仍然意味着你的树有千兆字节的内存。

哇。。。你知道一棵30高的树有多少个节点吗?我想知道你是否应该创建一棵有31个节点的树。那将是一个更合理的要求。谢谢你的回答。这证实了我的怀疑,并使我认为给我的高度可能是一个错误。