首页 > 试题广场 >

遍历二叉树

[编程题]遍历二叉树
  • 热度指数:139 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

某地主担心农民偷取他的粮食,雇人挖了大量地窖来屯粮,这些地窖层层排列,只有一个总入口。 每个地窖都有一个随机且唯一的数字编号(1 ... N)。聪明的农夫经过一番侦察,发现所有的地窖形成了一颗满二叉树,只有叶子节点中才存放有粮食,粮食数量与地窖编号相同。 狡猾的地主设置了报警装置,只要任意两个相邻的叶子节点中粮食被偷,就会自动报警。
农夫事先并不知道地窖分布图,但是他无意间得到了地窖组成的二叉树的前序遍历和中序遍历结果,请帮忙计算一下,在不触发报警装置的情况下,农夫最多可以偷取地主多少粮食。
提示:

  1. 如果一个二叉树的层数为K,且节点总数是2k -1 ,则它就是满二叉树,如下图所示。
  2. 下图中节点1和节点2,节点2和节点3均为相邻的叶子节点, 节点1和节点3不属于相邻叶子节点;


输入描述:

第一行输入一个数字n表示有n个节点的满二叉树

第二行n个数字a[0],a[1]...a[n-1]用空格隔开,表示二叉树的前序遍历

第三行n个数字b[0],b[1]...b[n-1]用空格隔开,表示二叉树的中序遍历

数据范围:

3<=n<=105 且n可以表示成2k-1(k为整数)

a[0]...a[n-1]中1,2...n每个数字分别出现一次

b[0]...b[n-1]中1,2...n每个数字分别出现一次



输出描述:
输出一个数字,表示农夫最多可以偷取地主多少粮食
示例1

输入

3
2 1 3
1 2 3

输出

3
头像 王清楚
发表于 2020-09-22 17:16:23
这道题一开始看到的时候想先把二叉树剪出来,然后再找出叶子节点做一个动态规划,然后仔细一想发现,对于满二叉树来说,中序遍历的第1,3,5,7.。。项就是叶子节点。那我们就可以直接获得叶子节点了, 然后用 表示前 个节点可以获得的最大粮食数,可以从(偷当前节点的粮食)和(不偷当前节点的粮食)转移而来 展开全文