UVa 548 (二叉树的递归遍历) Tree
题意:
给出一棵由中序遍历和后序遍历确定的点带权的二叉树。然后找出一个根节点到叶子节点权值之和最小(如果相等选叶子节点权值最小的),输出最佳方案的叶子节点的权值。
二叉树有三种递归的遍历方式:
- 先序遍历,先父节点 然后左孩子 最后右孩子
- 中序遍历,先左孩子 然后父节点 最后父节点
- 后序遍历,先左孩子 然后右孩子 最后父节点
这里有更详细的解释:
http://blog.csdn.net/sicofield/article/details/9066987
紫书上面写错了,后序遍历最后一个元素才是根节点。确定根节点以后,我们再根据这个值在中序遍历的序列中找到他。然后以根节点为界,左边的元素是左子树的元素,右边的元素是右子树的元素。再进行递归。
关于中序遍历和后序遍历的关系,这里写的很具体:
http://blog.csdn.net/frankiller/article/details/7759871
因为权值各不相同,所以用权值的大小来作为节点编号。
//#define LOCAL
#include <iostream>
#include <cstdio>
#include <string>
#include <sstream>
#include <algorithm>
using namespace std; const int maxv = + ;
int in_order[maxv], post_order[maxv], lch[maxv], rch[maxv];
int n; bool read_list(int* a)
{
string line;
if(!getline(cin, line)) return false;
stringstream ss(line);
n = ;
int x;
while(ss >> x) a[n++] = x;
return n > ;
} int build(int L1, int R1, int L2, int R2)
{
if(L1 > R1) return ;
int root = post_order[R2];
int p = L1;
while(in_order[p] != root) p++;
int cnt = p - L1; //左子树节点的个数
lch[root] = build(L1, p - , L2, L2 + cnt - );
rch[root] = build(p + , R1, L2 + cnt, R2 - );
return root;
} int best, best_sum; void DFS(int u, int sum)
{
sum += u;
if(!lch[u] && !rch[u])
{//叶子
if(sum < best_sum || (sum == best_sum && u < best))
{
best = u;
best_sum = sum;
}
}
if(lch[u]) DFS(lch[u], sum);
if(rch[u]) DFS(rch[u], sum);
} int main(void)
{
#ifdef LOCAL
freopen("548in.txt", "r", stdin);
#endif while(read_list(in_order))
{
read_list(post_order);
build(, n-, , n-);
best_sum = ;
DFS(post_order[n-], );
printf("%d\n", best);
} return ;
}
代码君
UVa 548 (二叉树的递归遍历) Tree的更多相关文章
- Uva 548 二叉树的递归遍历lrj 白书p155
直接上代码... (另外也可以在递归的时候统计最优解,不过程序稍微复杂一点) #include <iostream> #include <string> #include &l ...
- 二叉树的递归遍历 Tree UVa548
题意:给一棵点带权的二叉树的中序和后序遍历,找一个叶子使得他到根的路径上的权值的和最小,如果多解,那该叶子本身的权值应该最小 解题思路:1.用getline()输入整行字符,然后用stringstre ...
- 二叉树的递归遍历 The Falling Leaves UVa 699
题意:对于每一棵树,每一个结点都有它的水平位置,左子结点在根节点的水平位置-1,右子节点在根节点的位置+1,从左至右输出每个水平位置的节点之和 解题思路:由于上题所示的遍历方式如同二叉树的前序遍历,与 ...
- 数据结构之二叉树篇卷三 -- 二叉树非递归遍历(With Java)
Nonrecursive Traversal of Binary Tree First I wanna talk about why we should <code>Stack</c ...
- C++编程练习(17)----“二叉树非递归遍历的实现“
二叉树的非递归遍历 最近看书上说道要掌握二叉树遍历的6种编写方式,之前只用递归方式编写过,这次就用非递归方式编写试一试. C++编程练习(8)----“二叉树的建立以及二叉树的三种遍历方式“(前序遍历 ...
- Trees on the level UVA - 122 (二叉树的层次遍历)
题目链接:https://vjudge.net/problem/UVA-122 题目大意:输入一颗二叉树,你的任务是按从上到下,从左到右的顺序输出各个结点的值.每个结点都按照从根节点到它的移动序列给出 ...
- UVa 548 Tree【二叉树的递归遍历】
题意:给出一颗点带权的二叉树的中序和后序遍历,找一个叶子使得它到根的路径上的权和最小. 学习的紫书:先将这一棵二叉树建立出来,然后搜索一次找出这样的叶子结点 虽然紫书的思路很清晰= =可是理解起来好困 ...
- UVA - 548 Tree(二叉树的递归遍历)
题意:已知中序后序序列,求一个叶子到根路径上权和最小,如果多解,则叶子权值尽量小. 分析:已知中序后序建树,再dfs求从根到各叶子的权和比较大小 #include<cstdio> #inc ...
- UVA - 548 根据中序遍历和后序遍历建二叉树(关于三种遍历二叉树)
题意: 同时给两个序列,分别是二叉树的中序遍历和后序遍历,求出根节点到叶子结点路径上的权值最小和 的那个 叶子节点的值,若有多个最小权值,则输出最小叶子结点的和. 想法: 一开始想着建树,但是没有这样 ...
随机推荐
- 疯狂java讲义——初始化块
- no module named staticfiles
原地址:http://blog.sina.com.cn/s/blog_77500e110100umms.html 今天想试一下django的Uploadify,找了个例子,运行时出错:myprojec ...
- nefu 120 梅森素数
题意:给出p(1<p<=62),让你求Mp=2^p-1是否为梅森素数. 梅森素数:若p为素数,且Mp=2^p-1也是素数,则Mp为梅森素数.若p为合数,Mp=2^p-1一定为合数若p为素数 ...
- AwSnap:让全版本(Windows、iOS、Android)Chrome浏览器崩溃的有趣漏洞
彩蛋爆料直击现场 几周前,我们曾报道了13个字符导致Chrome崩溃的漏洞.然而,这个漏洞有个小小的遗憾,那就是它只在MAC OS X下生效,其他系统并不受影响. 现在,我们又有了一个更有趣的漏洞.黑 ...
- POJ 1496
#include <iostream> #include <string> using namespace std; int fac(int num); int C(int n ...
- 概述Log4j简介
在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日志操作类外,Apache为我们提供了一个强有力的日志操作包-Log4j. Log4j是Apache的一个开放源代码项目,通过使用Log4j ...
- 2014多校第六场 1010 || HDU 4930 Fighting the Landlords (模拟)
题目链接 题意 : 玩斗地主,出一把,只要你这一把对方要不了或者你出这一把之后手里没牌了就算你赢. 思路 : 一开始看了第一段以为要出很多次,实际上只问了第一次你能不能赢或者能不能把牌出尽. #inc ...
- ExtJs之VTYPE验证
<!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...
- ExtJs之进度条实现
慢慢按书上的作. <!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta h ...
- Linux之proc详解
1. /proc目录 Linux内核提供了一种通过/proc文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以 ...