华为 OD 机试:求和二叉树
题目描述
给出一个二叉树如下图所示:
请由该二叉树生成一个新的二叉树,它满足其树中的每个节点将包含原始树中的左子树和右子树的和。
左子树表示该节点左侧叶子节点为根节点的一颗新树;右子树表示该节点右侧叶子节点为根节点的一颗新树。
输入描述
2 行整数,第 1 行表示二叉树的中序遍历,第 2 行表示二叉树的前序遍历,以空格分割
例如:
7 -2 6 6 9
6 7 -2 9 6
输出描述
1 行整数,表示求和树的中序遍历,以空格分割
例如:
-2 0 20 0 6
示例一
输入
-3 12 6 8 9 -10 -7
8 12 -3 6 -10 9 -7
输出
0 3 0 7 0 2 0
python code
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
ino = [-3, 12, 6, 8, 9, -10, -7]
pre = [8, 12, -3, 6, -10, 9, -7]
def index_of_list(l, y):
rl = []
for i, v in enumerate(l):
if v == y:
rl.append(i)
return rl
def find_ind(v, f_ino, f_pre):
ind = -1
if f_ino.count(v) == 1:
ind = f_ino.index(v)
else:
index_one_list = index_of_list(f_ino, v)
for j in index_one_list:
# print(sorted(f_ino[:j]), sorted(f_pre[1: 1 + len(f_ino[:j])]), sorted(f_ino[j + 1:]),
# sorted(f_pre[1 + len(f_ino[:j]):]))
if sorted(f_ino[:j]) == sorted(f_pre[1: 1 + len(f_ino[:j])]) and sorted(f_ino[j + 1:]) == sorted(
f_pre[1 + len(f_ino[:j]):]):
ind = j
break
return ind
def create_tree(f_ino, f_pre):
if not f_pre:
return
v = f_pre[0]
ind = find_ind(v, f_ino, f_pre)
root = TreeNode(v)
root.left = create_tree(f_ino[:ind], f_pre[1:1 + len(f_ino[:ind])])
root.right = create_tree(f_ino[ind + 1:], f_pre[1 + len(f_ino[:ind]):])
return root
def print_pre(node):
if node is None:
return
print(node.val, end=' ')
print_pre(node.left)
print_pre(node.right)
def print_ino(node):
if node is None:
return
print_ino(node.left)
print(node.val, end=' ')
print_ino(node.right)
def cal_node(node):
if node is None:
return None
node.val = cal_node_sum(node.left)+cal_node_sum(node.right)
cal_node(node.left)
cal_node(node.right)
return node
def cal_node_sum(node):
if node is None:
return 0
return node.val + cal_node_sum(node.left) + cal_node_sum(node.right)
root = create_tree(ino, pre)
# print_pre(root)
# print()
# print_ino(root)
# print()
root_tran = cal_node(root)
print_ino(root_tran)