【问题标题】:Convert tree nodes to coordinates of endpoints of edges将树节点转换为边端点的坐标
【发布时间】:2015-11-14 23:25:26
【问题描述】:

我有一个(重新组合的)二叉树t = ((4,), (3, 5), (2, 4, 6), (1, 3, 5, 7)),其中晶格层级索引为(0,1,2,3)。即 4 的索引为 0,而 3、5 的索引为 1,依此类推。我需要一组边缘端点的坐标(连接树节点)。自然地,4 与 3 和 5 相连; 3 连接到 2 和 4; 5 连接到 4 和 6。

对我可能采取的方法有什么想法吗?

输出是元素(以任何顺序)(这些是成对的对)

[(0,4),(1,3)], [(0,4),(1,5)], 
[(1,3),(2,2)], [(1,3),(2,4)], [(1,5),(2,4)], [(1,5),(2,6)], 
[(2,2),(3,1)], [(2,2),(3,3)], [(2,4),(3,3)], [(2,4),(3,5)], [(2,6),(3,5)], [(2,6),(3,7)]

树可以生长。任何可迭代的基本数据(列表、集合、元组、字典等)都可以。

我认为将树转换为矩阵的下对角线会使事情变得更容易,但现在认为可能有直接的方法。

以下是此重组树的进程示例:

如果需要澄清,请告诉我。

【问题讨论】:

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


    【解决方案1】:

    如果所有相邻节点都被认为是对:

    t = ((4,), (3, 5), (2, 4, 6), (1, 3, 5, 7))
    
    from itertools import tee
    a, b = tee(t)
    next(b)
    for ind, (t1, t2) in enumerate(zip(a, b)):
        print([[(ind, i), (ind + 1, j)] for i in t1 for j in t2])
    

    您必须对输出进行分组,但这应该更接近您的需要:

    def pairs(t):
        a, b = tee(t)
        next(b)
        for ind, (t1, t2) in enumerate(zip(a, b)):
            it = iter(t2)
            nxt = next(it)
            for ele in t1:
                n = next(it)
                yield [(ind, ele), (ind + 1, nxt)]
                yield [(ind, ele), (ind + 1, n)]
                nxt = n
    
    
    from pprint import pprint as pp
    pp(list(pairs(t)),compact=1)
    

    输出:

    [[(0, 4), (1, 3)], [(0, 4), (1, 5)], [(1, 3), (2, 2)], [(1, 3), (2, 4)],
     [(1, 5), (2, 4)], [(1, 5), (2, 6)], [(2, 2), (3, 1)], [(2, 2), (3, 3)],
     [(2, 4), (3, 3)], [(2, 4), (3, 5)], [(2, 6), (3, 5)], [(2, 6), (3, 7)]]
    

    【讨论】:

    • 好主意...只是不确定为什么将[(1, 3), (2, 6)](等等)添加到输出列表中。这些坐标不在原始列表中。我正在尝试找出改进之处。
    • 他们不是来自(3, 5), (2, 4, 6)吗?
    • 好问题。树是(重组)二项式。因此,每个节点仅连接到两个节点。因此,3 连接到 2、4; 5 连接到 4、6 等等。示例输出强调了这个想法。就像任何其他二叉树一样,在第 n 步有 n 个节点;树线性增长(但路径数不会:))。我为视觉添加了一张图片。
    • 嗯,确实,二叉树应该是一个很好的线索;)顺序是否像pastebin.com/Ydjn9b8v一样重要?
    • 答案的第二部分应该做你想做的事,如果你真的需要分组的输出,你可以改变逻辑
    猜你喜欢
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    相关资源
    最近更新 更多