已知二叉树的先序和中序遍历结果,重建这棵二叉树
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