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.
Input
The input file will contain a description of the binary tree given as the inorder and postorder traversal
sequences of that tree. Your program will read two line (until end of file) from the input file. The first
line will contain the sequence of values associated with an inorder traversal of the tree and the second
line will contain the sequence of values associated with a postorder traversal of the tree. All values
will be different, greater than zero and less than 10000. You may assume that no binary tree will have
more than 10000 nodes or less than 1 node.
Output
For each tree description you should output the value of the leaf node of a path of least value. In the
case of multiple paths of least value you should pick the one with the least value on the terminal node.

Sample Input
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

Sample Output
1
3
255

题意:定义一条路径的值为从根节点到叶子结点所有结点值的和。求值最小的那条路径的叶子结点。若两条路径的的值相同,那么求叶子结点的值较小的那个。

#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
const int MAXN=;
const int INF=0x3f3f3f3f;
char s[MAXN];
int mx,k;
void handle(int buf[],int &len)
{
int l=strlen(s);
int x=;
for(int i=;i<l;i++)
{
if(s[i]==' ')
{
buf[len++]=x;
x=;
}
else
{
x*=;
x+=(s[i]-'');
}
}
buf[len++]=x;
}
int in[MAXN],len1;
int post[MAXN],len2;
void build(int l1,int r1,int l2,int r2,int sum)
{
if(l1>r1)
{
return ;
}
if(l1==r1&&l2==r2)//走到叶子结点
{
int x=sum+in[l1];
if(x<mx)
{
mx=x;
k=in[l1];
}
else if(x==mx)
{
k=min(k,in[l1]);
}
} int root=post[r2];
int p=;
while(in[p]!=root) p++;
int cnt=p-l1;
build(l1,p-,l2,l2+cnt-,sum+root);
build(p+,r1,l2+cnt,r2-,sum+root);
}
int main()
{
while(cin.getline(s,MAXN))
{
len1=len2=;
handle(in,len1);
cin.getline(s,MAXN);
handle(post,len2);
mx=INF;
k=INF;
build(,len1-,,len2-,);
cout<<k<<endl;
}
return ;
}

UVA548(二叉树遍历)的更多相关文章

  1. C++ 二叉树遍历实现

    原文:http://blog.csdn.net/nuaazdh/article/details/7032226 //二叉树遍历 //作者:nuaazdh //时间:2011年12月1日 #includ ...

  2. python实现二叉树遍历算法

    说起二叉树的遍历,大学里讲的是递归算法,大多数人首先想到也是递归算法.但作为一个有理想有追求的程序员.也应该学学非递归算法实现二叉树遍历.二叉树的非递归算法需要用到辅助栈,算法着实巧妙,令人脑洞大开. ...

  3. 【二叉树遍历模版】前序遍历&&中序遍历&&后序遍历&&层次遍历&&Root->Right->Left遍历

    [二叉树遍历模版]前序遍历     1.递归实现 test.cpp: 12345678910111213141516171819202122232425262728293031323334353637 ...

  4. hdu 4605 线段树与二叉树遍历

    思路: 首先将所有的查询有一个vector保存起来.我们从1号点开始dfs这颗二叉树,用线段树记录到当前节点时,走左节点的有多少比要查询该节点的X值小的,有多少大的, 同样要记录走右节点的有多少比X小 ...

  5. poj2255 (二叉树遍历)

    poj2255 二叉树遍历 Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu   Descripti ...

  6. D - 二叉树遍历(推荐)

    二叉树遍历问题 Description   Tree Recovery Little Valentine liked playing with binary trees very much. Her ...

  7. 二叉树遍历 C#

    二叉树遍历 C# 什么是二叉树 二叉树是每个节点最多有两个子树的树结构 (1)完全二叉树——若设二叉树的高度为h,除第 h 层外,其它各层 (1-h-1) 的结点数都达到最大个数,第h层有叶子结点,并 ...

  8. 二叉树——遍历篇(递归/非递归,C++)

    二叉树--遍历篇 二叉树很多算法题都与其遍历相关,笔者经过大量学习.思考,整理总结写下二叉树的遍历篇,涵盖递归和非递归实现. 1.二叉树数据结构及访问函数 #include <stdio.h&g ...

  9. 二叉树遍历(flist)(二叉树,已知中序层序,求先序)

    问题 C: 二叉树遍历(flist) 时间限制: 1 Sec  内存限制: 128 MB提交: 76  解决: 53[提交][状态][讨论版][命题人:quanxing][Edit] [TestDat ...

随机推荐

  1. Kubernetes 命令补全

    yum install -y bash-completionsource /usr/share/bash-completion/bash_completionsource <(kubectl c ...

  2. python装饰器实现HTTP请求耗时和入参返回日志记录

    装饰器方法: 1 def decoArgs(server_name): 2 def deco(func): 3 def wrapper(view, request, *args, **kwargs): ...

  3. Android SDK组件:webview笔记

    1.安卓手机中内置了一款webkit内核的浏览器,在SDK中封装为WebView组件. 2.该组件可以在自己的应用程序中显示本地或者Internet上的网页,也可以把它当作一个浏览器来时用. 3.We ...

  4. Sublime 输入中文显示方框问号乱码

     最近使用的sublime 编辑器出现了打开写好的程序,中文显示的确是方框,方框里面是问号,就是不显示中文.     然后再网上查找了一下,大概都是说是需要中文编码插件,比如converttoutf8 ...

  5. 关于发邮件报错535 Error:authentication failed&553 authentication is required

    553 authentication is required:这个错误的意思是你必须需要认证. 也就是说,你连接smtp服务器的时候必须使用密码来连接:下面代码红色那句 代码: @Override p ...

  6. R语言学习笔记(4)

    第四章:基本数据管理 一 贯穿整章的示例 二 变量的创建.重编码和重命名 三 日期值与缺失值 四 数据类型和类型转换 五 数据集的排序.合并与取子集 一 贯穿整章的示例(leadership)  ,, ...

  7. list!=null跟list.isEmpty()有什么区别?

    这就相当与,你要喝水,前面list!=null就是判断是不是连水杯都没有,后面!list.isEmpty就是判断水杯里面没有水,连盛水的东西都没有,这个水从何而来?所以一般的判断是if(list!=n ...

  8. ubuntu安装vmplayer出现问题的解决方法

    ubuntu安装vmplayer 出现问题的解决方法 1:ubuntu12.04安装vmware12出现cannot ope dev/vmmon及modprobe vmmon提示密钥无效的解决办法 笔 ...

  9. nova Rescue 和 Unrescue

    usage: nova rescue [--password <password>] [--image <image>] <server> Reboots a se ...

  10. Android之动画1

    点此下载 package com.example.animationdemo; import java.util.Timer; import java.util.TimerTask; import a ...