【问题标题】:Creating formula based on binary tree leaves基于二叉树叶创建公式
【发布时间】:2014-04-24 05:34:41
【问题描述】:

我有长度为 n 的点列表(在下面的示例 n = 6 中),之后我根据这些默认点制作了一些其他点,例如点 7 是由“与”点 5 和点 4 制成的,依此类推现在我的问题是基于我拥有的数据结构,我怎样才能检索公式链?例如对于第 10 点(递归或非递归)我怎么能说这个点从哪里来?。

如果我想知道第 10 点是如何产生的,它必须返回如下内容:

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

【问题讨论】:

  • 您是否已经有一些数据结构来表示您所拥有的?
  • @Alfe 不,我刚刚做了一个例子,现在我只有列表点 + 新点列表(在一个列表中)和 3 个不同的列表,它们保留了第一个点和第二个点以及运算符
  • 我建议将你得到的东西转换成一个可以保存在一个变量中的值。将我的回答视为对我的意思的解释。

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


【解决方案1】:

在开始之前,您需要展示您所拥有的东西。我建议这样:

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])

【讨论】:

  • 我会尽量按照你的建议去做,但是你的解决方案中有一个简单的问题是必须从索引 1 开始吗?
  • 我的第二个问题如何才能只获得所有独特点?例如在上面的例子中,只有一个列表包含 [2,3,4,5],提前感谢
  • 当然不是。我刚刚适应了你的问题。 从索引 1 开始 :)
  • 是什么让一个点与众不同?什么定义?您想要该公式中所有使用点的列表吗?
  • 为公式使用的点添加了一部分。但是请记住,SO 不是一个让其他人编写您的东西的平台;-) 您已经通过一个新问题扩展了您的原始问题。这是小菜一碟,所以我不介意添加它,但是您应该考虑就您自己编写的代码的新功能提出 问题。而且,再次,在问这里之前尝试一些东西:)
猜你喜欢
  • 1970-01-01
  • 2017-07-01
  • 1970-01-01
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多