建志提供(7)----------バイナリツリーの再構築

二分木の前順と中次のトラバーサル結果を知って、二分木を再構築する

class Node:
    def __init__(self, val, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

    def __str__(self):
        return str(self.val)

def find_root(pos_d, mid_order):
    min_pos, min_ix = None, 0
    for i, v in enumerate(mid_order):
        if min_pos is None or pos_d[v] < min_pos:
            min_pos  = pos_d[v]
            min_ix = i

    return min_ix

def rebuild_bin_tree_dict(pre_order, mid_order):
    d = {}
    for v in mid_order:
        for i, k in enumerate(pre_order):
            if k == v:
                d[v] = i
                break
    return rebuild_bin_tree(d, mid_order)

def rebuild_bin_tree(pos_d, mid_order):
    if not mid_order:
        return None
    k = find_root(pos_d, mid_order)
    root = Node(mid_order[k])
    root.left = rebuild_bin_tree(pos_d, mid_order[0:k])
    root.right = rebuild_bin_tree(pos_d, mid_order[k+1:])
    return root

if __name__ == "__main__":
    root = rebuild_bin_tree_dict([1,2,4,7,3,5,6,8], [4,7,2,1,5,3,8,6])
    from collections import deque
    q = deque()
    q.append(root)
    while q:
        n_q = deque()
        while q:
            n = q.popleft()
            print(n, end='   ')
            if n:
                n_q.append(n.left)
                n_q.append(n.right)
        print()
        q = n_q

 

公開された230元の記事 ウォンの賞賛160 ビュー820 000 +

おすすめ

転載: blog.csdn.net/happyAnger6/article/details/104734907