使用 python 中的列表表示树

Tree representation using list in python

对于这棵树,

作为初学者,下面是我的列表表示,

tree = [
          [
              [
                 [
                   [], 3, []
                 ], 
                 10,
                 [
                   [], 17, []
                 ]
              ],
              25,
              [
                 [
                   [], 30, []
                 ],
                 32,
                 [
                   [], 38, []
                 ]
              ]
          ],
          40,
          [
             [
               [], 50, []
             ], 
             78,
             [
               [], 93, []
             ]
          ]
       ]

使用 python 列表这种表示是否正确?

我可以在这个表示中避免空列表 [] 吗?

这取决于你所说的 'represent' 是什么意思。您可以仅通过列表中的元素来表示树,例如list = [40,25,78,10,32,50,93,3,17,30,38] 然后遍历它,如果你想重新创建你可以遍历列表的树,因为你知道生命 child of list[(i+1)*2-1] 右边的child是list[(i+1)*2]。

注意:你必须执行 i+1 因为第一个元素的索引为 0,而 I 是 parent 节点的索引,例如25 的索引+1 是 2 因此 25 的左索引+1 child 是 4.

使用列表表示树的方法有很多种。

您可以使用一维列表。这对于具有一定数量 children 的完整树非常有效。或者对于缺少 children 的数组,用 None 填充数组,其中叶节点的 child 应该是。 如果当前节点位于索引 i,则其 children 将位于索引 i*2 + 1 和 (i+1)*2。你的 parent 将是 (i-1)/2.

您也可以使用 lisp-like 树表示。

[根, LEFT_SUB_TREE, RIGHT_SUB_TREE]

你的示例树看起来像:

[40, [25, [10, 3, 17], [32, 30, 38]], [78, 50, 93]]

叶节点不需要是一个列表,它们可以只是它们的值。

与一维列表表示相比,此方法为备用树使用的内存更少。

对于任何二叉树也很容易做到这一点,每个节点的 children 数量不同。

[根, SUB_TREE_1, SUB_TREE_2, ..., SUB_TREE_n]

你的表示很有意义,因为它只使用了 2 个简单的规则。树是一个列表,可以是:

[]                          #empty tree
[list, number, list]        #non-empty tree

这种简单性使得以统一的方式编写代码和处理事物变得容易(并且没有很多 if 语句)。

另一个同样简单的表示是使用元组而不是列表 and/or 使用 None 表示空树。

另一种表示是将叶子节点中的数字直接放在父节点中(例如将10以下的子树编码为[3,10,17])。这更紧凑并摆脱了空列表,但现在逻辑更复杂,一棵树可以用 5 种不同的方式表示:

[]
[list, number, list]
[list, number, number]
[number, number, list]
[number, number, number]

表示更复杂意味着您可能需要编写更多代码。