我正在研究Project Euler 问题 18(我确实解决了问题;我没有作弊。“证明”在这里)并且发现自己需要一种方法来表示看起来像帕斯卡三角形但具有不同值的数据结构. 它看起来与二叉树非常相似,但有一个非常重要的区别:节点的子节点不只是它的子节点。所以前三行如下所示:
75
/ \
95 64
/ \ / \
17 47 82
请注意,47 有两个父母。
将其表示为链接结构甚至二维数组非常容易,但我希望有一种更优雅的方式。我喜欢二叉树,主要是因为你可以分配一块内存,将其视为一个数组,并通过几个算术运算或整数除法在子级和父级之间导航。有没有办法对这个数据结构做同样的事情?
我最好的解决方案是使用二维数组(很容易找到孩子和父母)。我不喜欢这种实现,因为(至少我这样做的方式)我要求malloc
每一行,即使我提前知道结构会有多大。
我的问题与这个问题非常相似,但我对接受的答案不满意。评论暗示了我寻求的解决方案,但没有给出任何解释。
编辑:为了澄清,我正在寻找一种方法来索引一维数组,其方式与按顺序填充到数组中的二叉树(从 1 开始)给出索引i处节点的子节点的属性相同在索引 2 * i和 2 * i + 1 处。我也不太担心能否找到父母,所以不要太担心奇怪的两个父母。