题目大意:给出一棵二叉树的中序遍历结果和后序遍历,求叶子到根节点路径上的最小值
解题思路:先根据中序和和后序建立二叉树,遍历二叉树求解
用两个数组存左右孩子
后序的最后一个为根
在中序中遍历找的根,左边为左子树,右边为右子树
注意求解时要判断是否为叶子在判断
#include <iostream>
#include<string>
#include<algorithm>
#include<sstream>
using namespace std;
int n;
int zhong[10005];
int hou[10005];
int l[10005]; //存左孩子
int r[10005]; //存右孩子
bool duru(int *a)
{
string l;
if(!getline(cin,l))
return false;
stringstream in(l); //把l的内容放in里
n=0;
int x;
while(in>>x) //从in里读数据
a[n++]=x;
return n>0;
}
int jianshu(int l1,int r1,int l2,int r2)
{
if(l1>r1)
return 0;
int root=hou[r2];
int p=l1;
while(zhong[p]!=root)
p++;
int cnt=p-l1;
l[root]=jianshu(l1,p-1,l2,l2+cnt-1);
r[root]=jianshu(p+1,r1,l2+cnt,r2-1);
return root;
}
int b,bs;
void dfs(int u,int sum)
{
sum+=u;
if(!l[u]&&!r[u])//叶子节点
{
if(sum<bs||(sum==bs&&u<b))
{
b=u;
bs=sum;
}
}
if(l[u])
dfs(l[u],sum);
if(r[u])
dfs(r[u],sum);
}
int main()
{
//cout << "Hello world!" << endl;
while(duru(zhong))
{
duru(hou);
jianshu(0,n-1,0,n-1);
bs=1000000000;
dfs(hou[n-1],0);
cout<<b<<endl;
}
return 0;
}