标签:des style io color ar os 使用 sp for
You are to determine the value of the leaf node in a given binary tree that is the terminal node of a path of least value from the root of the binary tree to any leaf. The value of a path is the sum of values of nodes along that path.
3 2 1 4 5 7 6 3 1 2 5 6 7 4 7 8 11 3 5 16 12 18 8 3 11 7 16 18 12 5 255 255
1 3 255
题意:给出一颗树的中序遍历和后序遍历;然后要你求出从根节点到叶节点所经过的结点的最小值的叶节点;若果值相等,那么输出较小的那个。
<span style="font-size:14px;"># include <cstdio> # include <string> # include <sstream> # include <algorithm> # include <iostream> using namespace std; int in_order[10005],out_order[10005],n,lch[10005],rch[10005],best,best_sum; bool read_list(int *a) // 读入字符串; { string s; if(!getline(cin,s)) return false; //如果为空,那么返回假,跳出循环; stringstream ss(s); n=0; while(ss>>a[n]) n++; //使用流,将数据读入数组; return n>0; //返回n的值; } int build(int l1,int r1,int l2,int r2) //建立树;查找根结点;后序遍历的最后一个肯定是根结点;然后 { //根据根结点的位置,分出根结点的左分枝和右分枝; if(l1>r1) return 0; int root=out_order[r2],p=l1; while(in_order[p]!=root) p++; int cnt=p-l1; lch[root]=build(l1,p-1,l2,l2+cnt-1); rch[root]=build(p+1,r1,l2+cnt,r2-1); return root; } int dfs(int root,int sum) //从根节点开始遍历,找出和最小的叶节点; { sum+=root; if(!lch[root]&&!rch[root]) //判断是否到叶节点; { if(sum<best_sum||(sum==best_sum&&root<best)) { best_sum=sum; best=root; } } if(lch[root]) dfs(lch[root],sum); if(rch[root]) dfs(rch[root],sum); return 0; } int main() { //freopen("a.txt","r",stdin); while(read_list(in_order)) { read_list(out_order); build(0,n-1,0,n-1); best_sum=1000000; //赋初始值; dfs(out_order[n-1],0); cout<< best <<'\n'; } return 0; }</span>
标签:des style io color ar os 使用 sp for
原文地址:http://blog.csdn.net/rechard_chen/article/details/41016017