Jianzhi offer (7) ---------- Rebuilding Binary Tree

Knowing the pre-order and mid-order traversal results of the binary tree, reconstruct the binary tree

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

 

Published 230 original articles · 160 praises · 820,000 views

Guess you like

Origin blog.csdn.net/happyAnger6/article/details/104734907