代码之家  ›  专栏  ›  技术社区  ›  Archer

如何在python中按顺序(使用anytree)合并两棵树(多路树)

  •  -4
  • Archer  · 技术社区  · 7 年前

    如何在python中按顺序合并两棵树(使用anytree) 将同一深度节点按顺序(按顺序表示同一深度节点从左到右逐个)合并到一个新节点,并添加边权重。 enter image description here

    from anytree import Node, RenderTree,LevelOrderIter,search
    Root = Node(name="0", cart=0, cnt=0, goodsid='-1', parent=None)
    node1 = Node(name="1", cart=0, cnt=1, goodsid='-1', parent=Root)
    node2 = Node(name="2", cart=0, cnt=2, goodsid='-1', parent=Root)
    node3 = Node(name="3", cart=0, cnt=3, goodsid='-1', parent=Root)
    node4 = Node(name="4", cart=0, cnt=4, goodsid='-1', parent=Root)
    node5 = Node(name="5", cart=0, cnt=5, goodsid='-1', parent=node1)
    node6 = Node(name="6", cart=0, cnt=6, goodsid='-1', parent=node1)
    node7 = Node(name="7", cart=0, cnt=7, goodsid='-1', parent=node4)
    print(RenderTree(Root))
    Root_1 = Node(name="a", cart=0, cnt=0, goodsid='-1', parent=None)
    node_b = Node(name="b", cart=0, cnt=1, goodsid='-1', parent=Root_1)
    node_c = Node(name="c", cart=0, cnt=2, goodsid='-1', parent=Root_1)
    node_d = Node(name="d", cart=0, cnt=3, goodsid='-1', parent=node_b)
    node_e = Node(name="e", cart=0, cnt=4, goodsid='-1', parent=node_c)
    node_f = Node(name="f", cart=0, cnt=5, goodsid='-1', parent=node_c)
    node_g = Node(name="g", cart=0, cnt=5, goodsid='-1', parent=node_f)
    node_h = Node(name="h", cart=0, cnt=7, goodsid='-1', parent=node_g)
    print(RenderTree(Root_1))
    

    下面是两个示例树如何合并它们

    1 回复  |  直到 6 年前
        1
  •  1
  •   Archer    7 年前

    我已经解决了这个问题,这不同于用节点和合并两个二叉树

    def initial_node(name, cart=0, visit_cnt=1, goods_id='-1', depths=0, order_index=1, parent=None, pr=0):
        node = Node(name=name, cart=cart, visit_cnt=visit_cnt, back_cnt=0, goodsid=goods_id, depths=depths, sons_cnt=0,
                    order_index=order_index,
                    parent=parent, pr=pr)
        current_Node = node
        return current_Node
    
    
    
    def list_extend(l1, l2):
        len1 = len(l1)
        len2 = len(l2)
        if len1 == len2:
            pass
        elif len1 > len2:
            l2.extend([None] * (len1 - len2))
        else:
            l1.extend([None] * (len2 - len1))
        return l1, l2
    
    
    def tree_merge(node1, node2):
        res = None
        if node1 is None:
            res = node2
            res.goodsid = '-1'
            res.name = str(node2.depths) + '-' + str(node2.order_index)
            res.parent=node2.parent
            return res
        if node2 is None:
            res = node1
            res.goodsid = '-1'
            res.name = str(node1.depths) + '-' + str(node1.order_index)
            res.parent=node1.parent
            return res
        res=node1
        res.cart += node2.cart
        res.visit_cnt += node2.visit_cnt
        res.goodsid = '-1'
        children_1 = list(node1.children)
        children_2 = list(node2.children)
        children_1,children_2=list_extend(children_1,children_2)
        tmp_children=[]
        for i,j in zip(children_1,children_2):
            tmp_children.append(tree_merge(i,j))
        res.children=tmp_children
        return  res
    

    这是用于具有节点值和的多路树合并