剑指offer(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 · 访问量 82万+

猜你喜欢

转载自blog.csdn.net/happyAnger6/article/details/104734907