我正在尝试构建一个高度为30的完美二叉树。它不一定是BST,只是一棵普通的树;数据也不重要,因此每个节点的数据可以为空。我之前从未试图做过这样的事情,所以当我创建这棵树的方法导致疯狂的内存使用并且在运行几分钟后开始锁定我的计算机时,我有点沮丧。这是构建树的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)
值得一提的是,我也尝试使用列表表示。不幸的是,大小的列表的内存使用也是有问题的。
任何人都可以对实现这一目标的方法有所了解,这种方法不会占用太多内存并且可以在合理的时间内完成吗?
答案 0 :(得分:0)
在完美的二叉树中,每个级别的节点数量翻倍。具有n
级别的二叉树中的节点总数为2**n-1
。这意味着具有30个级别的完美二叉树将具有
1073741823
节点。这将导致"疯狂的内存使用"除非你重复节点,这是一个完美的二叉树。"
您可以做的最好是为每个节点使用尽可能少的内存。我能想到的最好的方法是使用完整二叉树的列表表示 - 索引j
的节点的子节点位于索引2*j
和2*j+1
,父节点位于索引j//2
。 (这适用于基于一个数组的数组。)这意味着您不需要将指针或索引存储到子节点或父节点。最后,使用尽可能少占用内存的列表。 T Numpy's Boolean array每个项目只使用一个字节。这仍然意味着你的树的内存为GB。