这道是道基础的二叉树题目,可以说帮我好好巩固了二叉树递归遍历的思想,有个地方要注意,就是路径和的最小值一开始初始化一定要足够大,不然会WA,因为一个节点的数字大小最大就有1万了。这个地方一定要注意。还有就是解题的关键就是,当p=0且n-p-1=0时就到叶节点了,其实就是n=1,p=0的时候,写的谨慎点就是p<=0&&n-p-1<=0。此时就可以判断sum和min1的大小了。下面是ac 代码
#include<cstdio>
#include<ctype.h>
#include<algorithm>
#include<iostream>
#include<string.h>
using namespace std;
int inorder[10000+10],postorder[10000+10];
int min1, record;
void build(int n, int *s1, int *s2,int sum)
{
int p,i;
if(n <= 0)
return;
for(i = 0;i < n; i++)
if(s2[n-1] == s1[i])
p = i;
sum+=s2[n-1];
if(p <= 0 && n-p-1 <= 0)
{
if(sum == min1)
record = s2[0] > record ? record :s2[0];
if(sum < min1)
{
min1 = sum;
record = s2[0];
}
}
build(p, s1, s2, sum);
build(n-p-1, s1+p+1, s2+p, sum);
}
int main()
{
// freopen("input.txt","r",stdin);
int n,i;
char ch;
while(scanf("%d",&inorder[0]) == 1)
{
ch = getchar();
for(i = 1; ch != '\n'; i++)
{
scanf("%d",&inorder[i]);
ch = getchar();
}
n = i;
for(i = 0;i < n; i++)
{
scanf("%d",&postorder[i]);
ch = getchar();
}
min1 = record = 1000000;//这个千万不能设置小,特别是min1的值,因为一个节点最大是1万
//求到叶节点的路径和就可能非常大了
build(n,inorder,postorder,0);
printf("%d\n",record);
}
return 0;
}