题目11-python华为原题题库- 求和二叉树

华为 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)

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值