基于二叉树叶创建公式

时间:2014-03-18 13:34:49

标签: python data-structures numpy binary-tree lis

我有长度为n的点列表(在下面的示例中n = 6)之后我根据这些默认点做了一些其他点,例如点7是由"和#34;点5和点4等现在我的问题是基于我的数据结构,我如何检索公式链?例如,对于第10点(递归或非递归),我怎么能说这一点从哪里开始?。

如果我想知道10号是如何制作的,那么它必须返回如下内容:

(((5 & 4) | 3) | 2) & (5 & 4)

enter image description here

1 个答案:

答案 0 :(得分:2)

在开始之前,你需要代表你所拥有的东西。我建议像这样:

points = [ None,  # dummy value to fill index 0 (we want to start at 1)
           None, None, None, None, None, None,  # for the first six atoms
           (5, 4, '&'),  # for point 7
           (7, 3, '|'),  # for point 8
           (8, 2, '|'),  # for point 9
           (9, 7, '&') ]  # for point 10

然后将公式创建为字符串只是递归的:

def formula(points, n):
  if points[n] is None:
    return str(n)
  a, b, operator = points[n]
  return '(%s %s %s)' % (formula(points, a), operator, formula(points, b))

print formula(points, 10)

这将打印

((((5 & 4) | 3) | 2) & (5 & 4))

要将公式中使用的所有点都作为一个集合,只需使用:

def used(points, n):
  if points[n] is None:
    return { n }
  a, b, operator = points[n]
  return used(points, a) | used(points, b)

print used(points, 10)

将打印:

set([2, 3, 4, 5])