Как объединить два дерева (multi-way tree) по порядку (используя 'anytree') в python - PullRequest
0 голосов
/ 12 сентября 2018

как объединить два дерева по порядку (используя 'anytree') в python объединить один и тот же узел глубины по порядку (по порядку означает узлы слева направо с одинаковой глубиной один за другим) в один новый узел и добавить вес ребра. 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 Ответ

0 голосов
/ 14 сентября 2018

Я решил вопрос, это отличается от слияния двух двоичных деревьев с суммой узлов

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

это для многоканального слияния деревьев с суммой значений узлов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...