Problem UVA548-Tree

Accept: 2287  Submit: 13947

Time Limit: 3000 mSec

Problem Description

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

题解:这个题有两个有价值的地方,一个是二叉树的数组实现,一个是通过中序和后序遍历构造处二叉树的先序遍历。

二叉树的数组实现也是递归的方式,在这个地方由于题目中说明节点权值都不一样而且权值的范围也很适合作为数组下标,因此直接用权值作为节点下标建树。

通过中序和后序遍历构造先序遍历建树并不困难,只要熟悉三种遍历的过程,就很容易找到方法。后序遍历的最后一个必定是根节点,然后他的前面,一部分是左子树,一部分是右子树,

这个时候问题就是精确到哪一位是左子树,利用中序遍历轻松搞定,在中序遍历中找到根节点,左边就是左子树,右边就是右子树,那各有几个就很清楚了,之后就交给递归就好了,需要注意递归基,

也就是在中序遍历序列中找不到子树区间的时候,也就是左端点 > 右端点的时候。

一般情况下,用数组实现二叉树需要自己“申请”节点,也就是和链式前向星里的tot++差不多的操作

 const int root = ;
int cnt; void newtree(){
lchild[root] = rchild[root] = ;
have_val[root] = false;
cnt = root;
} int newnode(){
int u = ++cnt;
lchild[u] = rchild[u] = ;
have_val[u] = false;
return u;
}

摘自紫书。

以下是该题代码

 #include <iostream>
#include <string>
#include <cstdlib>
#include <cstdio>
#include <sstream>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std; const int maxn = +;
int in_order[maxn],post_order[maxn];
int lchild[maxn],rchild[maxn];
int n,ans,Min; bool read_list(int *num){
string str;
if(!getline(cin,str)) return false;
stringstream ss(str);
n = ;
int x;
while(ss >> x){
num[n++] = x;
}
return n > ;
} int build(int l1,int r1,int l2,int r2){
if(l1 > r1) return ;
int root = post_order[r2];
int i = l1;
while(in_order[i] != root) i++;
int cnt = i-l1;
lchild[root] = build(l1,i-,l2,l2+cnt-);
rchild[root] = build(i+,r1,l2+cnt,r2-);
return root;
} void dfs(int root,int val){
val += root;
if(!lchild[root] && !rchild[root]){
if(Min == val) ans = ans < root ? ans : root;
else if(val < Min) ans = root,Min = val;
return;
}
if(val > Min) return;
if(lchild[root]) dfs(lchild[root],val);
if(rchild[root]) dfs(rchild[root],val);
} int main()
{
//freopen("input.txt","r",stdin);
while(read_list(in_order)){
read_list(post_order);
ans = ,Min = INF;
build(,n-,,n-);
dfs(post_order[n-],);
printf("%d\n",ans);
}
return ;
}

UVA548-Tree(二叉树数组表示)的更多相关文章

  1. 【日常学习】【二叉树遍历】Uva548 - Tree题解

    这道题目本身不难,给出后序遍历和中序遍历,求到节点最小路径的叶子,同样长度就输出权值小的叶子. Uva上不去了,没法測.基本上是依照ruka的代码来的.直接上代码 //Uva548 Tree #inc ...

  2. Leetcode 101 Symmetric Tree 二叉树

    判断一棵树是否自对称 可以回忆我们做过的Leetcode 100 Same Tree 二叉树和Leetcode 226 Invert Binary Tree 二叉树 先可以将左子树进行Invert B ...

  3. Leetcode 110 Balanced Binary Tree 二叉树

    判断一棵树是否是平衡树,即左右子树的深度相差不超过1. 我们可以回顾下depth函数其实是Leetcode 104 Maximum Depth of Binary Tree 二叉树 /** * Def ...

  4. [CareerCup] 4.7 Lowest Common Ancestor of a Binary Search Tree 二叉树的最小共同父节点

    4.7 Design an algorithm and write code to find the first common ancestor of two nodes in a binary tr ...

  5. [LeetCode] 111. Minimum Depth of Binary Tree ☆(二叉树的最小深度)

    [Leetcode] Maximum and Minimum Depth of Binary Tree 二叉树的最小最大深度 (最小有3种解法) 描述 解析 递归深度优先搜索 当求最大深度时,我们只要 ...

  6. UVA.548 Tree(二叉树 DFS)

    UVA.548 Tree(二叉树 DFS) 题意分析 给出一棵树的中序遍历和后序遍历,从所有叶子节点中找到一个使得其到根节点的权值最小.若有多个,输出叶子节点本身权值小的那个节点. 先递归建树,然后D ...

  7. [LeetCode] 111. Minimum Depth of Binary Tree 二叉树的最小深度

    Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shor ...

  8. [LeetCode] 543. Diameter of Binary Tree 二叉树的直径

    Given a binary tree, you need to compute the length of the diameter of the tree. The diameter of a b ...

  9. UVA548 Tree (二叉树的遍历)

    You are to determine the value of the leaf node in a given binary tree that is the terminal node of ...

  10. UVA548——Tree(中后序建树+DFS)

    Tree You are to determine the value of the leaf node in a given binary tree that is the terminal nod ...

随机推荐

  1. memcache 安装及使用

    memcache时php使用memcached的一个扩展,是一种分布式内存对象缓存系统.用来存储经常要查询到的数据,减少对数据库的访问,提高整体网站的速度. 简单提一下memcache与redis区别 ...

  2. Redis基础认识及常用命令使用(一)--转载

    Redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有序集 ...

  3. vb.bet 控件

    TextBox1.BackColor = Color.White'设置控件的背景色(白色) TextBox1.BackColor = Color.Yellow'设置控件的背景色(黃色) TextBox ...

  4. 【协议】5、gossip 协议

    Gossip是一种去中心化.容错并保证最终一致性的协议. Background:分布式环境 Gossip是为了解决分布式遇到的问题而设计的.由于服务和数据分布在不同的机器上,节点之间的每次交互都伴随着 ...

  5. 01-初始Java

    1. 你学习编程的目的是什么?学习编程最快的办法是什么? 答:我喜欢计算机,想更多的了解计算机的原理:我认为学习最快的办法就是尝试,只有不断地在计算机上尝试编程,遇到错误, 解决错误,才能更快的学会编 ...

  6. Confluence设置MySQL数据库报错:必须使用'READ-COMMITTED'作为默认隔离级别。

    解决方案: mysql -u root -p123456 SET GLOBAL tx_isolation='READ-COMMITTED'; mysql数据库创建 1.设置mysql隔离级别 SET ...

  7. jsPlumb.jsAPI阅读笔记(官方文档翻译)

    jsPlumb DOCS 公司要开始做流程控制器,所以先调研下jsPlumb,下文是阅读jsPlumb提供的document所产生的归纳总结 setup 如果不使用jQuery或者类jQuery库,则 ...

  8. 在Centos下面FTP映射方案

    前两天公司要在一台Centos的机子上,把一些文件定时备份到另外一台ftp服务器上, 在Linux系统中,mount是不支持直接挂在"ftp://192.168.1.1/backup&quo ...

  9. nginx-1-初识nginx

    Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由Igor Sysoev为俄罗斯访问量第二的R ...

  10. Windows下使用Rtools编译R语言包

    使用devtools安装github中的R源代码时,经常会出各种错误,索性搜了一下怎么在Windows下直接打包,网上的资料也是参差不齐,以下是自己验证通过的. 一.下载Rtools 下载地址:htt ...