【问题标题】:From nested tuples to edges of a binomial tree, in Python从嵌套元组到二叉树的边缘,在 Python 中
【发布时间】:2015-11-18 07:08:33
【问题描述】:

将嵌套元组结构(即重组二叉树/二叉树)转换为的快速方法是什么

t = (4, (3, 5, (2, 4, 6, (1, 3, 5, 7))))

到(有序的)边元组

((4,3), (4,5),                               # step 1 edges
 (3,2), (3,4),  (5,4), (5,6),                # step 2 edges
 (2,1), (2,3),  (4,3), (4,5),  (6,5), (6,7)) # step 3 edges

每个节点都指向一对子节点,一个在父节点之下,一个在父节点之上。因此,4 导致 3 和 5; 3 导致 2 和 4;等等。

元组t表示如下二叉树结构

【问题讨论】:

  • Emm.. 您已经构建了一些奇怪的数据结构(正如您的另一个问题所述)并且想要提取其部分/边缘/砖块?你真正的问题是什么?
  • 你对那个数据结构有什么发言权吗?它似乎包含 DAG 的行(列,在您提供的图像中),并且行自然地由像list 这样的序列表示...那么为什么它是嵌套的而不是顺序的?一系列行将是可迭代的,无需任何解包,并且作为奖励,您可以免费进行深度优先搜索:for row in rows: if target in row: do_something(target)
  • 方向不重要,但边缘很重要。我没有想到积木,但它可能是相关的 :) 这些树形转换是由对语言和结构效率(或限制)的探索驱动的。伟大的 cmets!
  • 如果方向无关紧要,那些箭头代表什么?这肯定意味着他们是被指挥的。树是总是指向的 --- parent-of 和 child-of 是非常不同的关系。 (从技术上讲,如果一个顶点可以有多个传入箭头,那么它根本不符合“树”的条件,这就是我称之为 DAG 的原因......这也可能是错误的,具体取决于您的要求 真的是。)
  • 您正在构建的结构看起来像经济学中的binomial options pricing model(也在“格模型”的" tree-based equity option valuation" sidebar 中)。它基于类似错误命名的“树”,甚至暗示“二项式”不仅仅是“二进制”的错字。 (我认为它是一个用于表示多项式集合的 DAG……这突然变得很有意义。)是您的目标吗?

标签: python algorithm python-3.x data-structures tree


【解决方案1】:
def g(t):
    res = []
    for i,x in enumerate(t[:-1]):
        res.append((x, t[-1][i]))
        res.append((x, t[-1][i+1]))
    return res

def h(t):
    if isinstance((t[-1]), tuple):
        return g(t) + h(t[-1])
    else:
        return []

t = (4, (3, 5, (2, 4, 6, (1, 3, 5, 7))))
print h(t)

【讨论】:

  • 为什么不给这些函数命名来表明它们的作用呢?
  • 这是亚马逊面试题之一:(
猜你喜欢
  • 2021-11-19
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
  • 1970-01-01
  • 2016-02-16
  • 2017-08-17
相关资源
最近更新 更多