中序遍历树(不一定是二叉树)
来源:互联网 发布:淘宝买家如何开店 编辑:程序博客网 时间:2024/05/21 23:31
题目描述
给一棵树,你可以把其中任意一个节点作为根节点。每个节点都有一个小写字母,中序遍历,得到一个字符串,求所有能得到的字符串的字典序最小串。因为这棵树不一定是二叉树,所以中序遍历时,先中序遍历以节点序号最小的节点为根的子树,然后再遍历根节点,最后根据节点序号从小到大依次中序遍历剩下的子树。
HINT
意思就是请枚举所有的点为根,然后中序遍历
最后输出所有结果中字典序最小的
比如说第二组数据
以0为根时结果为 bacd
以1为根时结果为 cadb
以2为根时结果为 badc
以3为根时结果为 bacd
所以字典序最小的是bacd
输入格式
多组数据,以EOF结束。
第一行一个数n(0<n<=100),表示树的节点的个数,节点从0开始。
然后一个长度为n的串,第i(0<=i<n)个字符表示节点i的字符。
接下来n-1行,每行两个数a,b,(0<=a,b<n),表示a和b之间有一条无向边。
输出格式
题中要求的最小的字符串
输入样例
3bac0 11 24abcd0 10 20 3
输出样例
bacbacd
根据题意,模拟书写递归函数。
题目描述
给一棵树,你可以把其中任意一个节点作为根节点。每个节点都有一个小写字母,中序遍历,得到一个字符串,求所有能得到的字符串的字典序最小串。因为这棵树不一定是二叉树,所以中序遍历时,先中序遍历以节点序号最小的节点为根的子树,然后再遍历根节点,最后根据节点序号从小到大依次中序遍历剩下的子树。
HINT
意思就是请枚举所有的点为根,然后中序遍历
最后输出所有结果中字典序最小的
比如说第二组数据
以0为根时结果为 bacd
以1为根时结果为 cadb
以2为根时结果为 badc
以3为根时结果为 bacd
所以字典序最小的是bacd
输入格式
多组数据,以EOF结束。
第一行一个数n(0<n<=100),表示树的节点的个数,节点从0开始。
然后一个长度为n的串,第i(0<=i<n)个字符表示节点i的字符。
接下来n-1行,每行两个数a,b,(0<=a,b<n),表示a和b之间有一条无向边。
输出格式
题中要求的最小的字符串
输入样例
3bac0 11 24abcd0 10 20 3
输出样例
bacbacd
首先不断递归到最左儿子,将最左儿子的字符加入ans字符串,接着回溯到父亲节点,判断刚才递归的是不是第一个儿子,如果是,就把父亲节点的字符加入ans。over。
伪代码如下
dfs(father) for son in father if(not visited) dfs(son) if(is the first son) add(father) if father have no son add father
#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <algorithm>#include <cstdlib>#include <queue>const int maxn = 1000005;using namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;#define mem(a,x) memset(a,x,sizeof a)char s[110];vector<int>G[110];string tmp;int vis[110];void traverse(int x){ int isfirst =0; for(int i=0;i<G[x].size();i++){ int nt = G[x][i]; if(!vis[nt]){ isfirst ++; vis[nt] = true; traverse(nt); if(isfirst == 1){ tmp += s[x]; } } } if(!isfirst) tmp += s[x];}int main(){ int n; while(scanf("%d",&n) !=EOF){ scanf("%s",s); for(int i=0;i<=n;i++) G[i].clear(); for(int i=0;i<n-1;i++){ int a,b;scanf("%d%d",&a,&b); G[a].push_back(b); G[b].push_back(a); } vector<string>vt; for(int i=0;i<n;i++){ tmp = ""; mem(vis,0); vis[i] = true; traverse(i); vt.push_back(tmp); } sort(vt.begin(),vt.end()); cout<<vt[0]<<endl; } return 0;}
1 0
- 中序遍历树(不一定是二叉树)
- 【二叉树】中序遍历二叉树
- 中序遍历二叉树
- 中序遍历二叉树
- 中序遍历二叉树
- 二叉树 - 中序遍历
- 中序遍历二叉树
- 中序遍历二叉树
- 二叉树-中序遍历
- 中序遍历二叉树
- 二叉树的遍历(2):中序遍历
- 已知二叉树后序遍历序列是DBCEFGHA,中序遍历序列EDCBAHFG,它的前序遍历的序列是?麻烦再画下这二叉树.
- 二叉树遍历(Java)---前序遍历,中序遍历,后序遍历
- 二叉树的遍历(1)--先序遍历,中序遍历,后序遍历
- 二叉树的遍历(前序遍历、中序遍历、后序遍历)
- 二叉树的遍历代码(先序遍历,中序遍历,后序遍历)
- 二叉树遍历(前序遍历,中序遍历,后序遍历)
- 4.8-找出二叉树和为sum的路径(始末点不一定是跟和叶)
- 央视315曝光活体识别的漏洞,是不是再次掀起一股智能AI浪潮?
- STL中list的使用
- Codeforces798D Mike and distribution
- HDU 1159 Common Subsequence【LCS(dp)】
- restTemplate公用魔板使用及中文乱码问题
- 中序遍历树(不一定是二叉树)
- SMTP邮件传输协议发送邮件和附件
- POJ 2431 Expedition(贪心+优先队列)
- linux基础3.12shell脚本2
- NIO中通道(Channel)
- 【Summary】——>Web组.Week4
- Struts2框架的基本使用(三)
- Nginx隐藏响应头信息的Server信息和版本信息
- JMeter学习笔记10-Graph Results介绍