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 根据中序遍历和后序遍历建二叉树(关于三种遍历二叉树)
题意: 同时给两个序列,分别是二叉树的中序遍历和后序遍历,求出根节点到叶子结点路径上的权值最小和 的那个 叶子节点的值,若有多个最小权值,则输出最小叶子结点的和. 想法: 一开始想着建树,但是没有这样 ...
随机推荐
- Excel每隔两行自动求和一次怎么操作?
今天ytkah得到一份数据,要求进行统计分析,由于是原始数据,还没处理过,数据量有点大,如下图所示(Excel每隔两行自动求和),每天的数字由两项组成,男生的人数.消费值和女生的人数和消费值,数字都在 ...
- spark分片个数的确定及Spark内存错误(GC error)的迂回解决方式
我们知道,spark中每个分片都代表着一部分数据,那么分片数量如何被确认的呢? 首先我们使用最常见的HDFS+Spark,sparkDeploy的方式来讨论,spark读取HDFS数据使用的是spar ...
- 迁移到MariaDB galera
迁移到MariaDB galera [已注销] [已注销] -- :: [安装] ====== https://downloads.mariadb.org/mariadb/repositories/ ...
- JSP 页面传参和接受参数
<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding=&q ...
- uva 11090
I I U P C 2 0 0 6 Problem G: Going in Cycle!! Input: standard input Output: standard output You are ...
- 理解Flight框架核心
http://blog.csdn.net/sky_zhe/article/details/38906689 Flight 框架 Flight类 1.加载 autoload.php ,启动框架的自动加载 ...
- swift函数和初始化控件(// MARK:分割线)
import UIKit , , , ) view.backgroundColor = UIColor.redColor() self.view.addSubview( ...
- POJ 1989
#include <iostream> #define MAXN 10005 using namespace std; bool mark[MAXN]; int main() { //fr ...
- WCF分布式开发步步为赢(9):WCF服务实例激活类型编程与开发
.Net Remoting的激活方式也有三种:SingleTon模式.SingleCall模式.客户端激活方式,WCF服务实例激活类型包括三种方式:单调服务(Call Service),会话服务(Se ...
- 离开csdn来到blog园
csdn里没有限制阅读访问的功能,所以我选择来到cnblog 但是不得不说,cnblog做的界面很丑,我个人很不喜欢,但是没办法