数据结构不难之树结构

第三篇 数据结构不难之树结构

题目1 : 后序遍历

描述

在参与过了美食节之后,小Hi和小Ho在别的地方又玩耍了一阵子,在这个过程中,小Ho得到了一个非常有意思的玩具——一棵由小球和木棍连接起来的二叉树!

小Ho对这棵二叉树爱不释手,于是给它的每一个节点都标记了一个标号——一个属于A…Z的大写字母,并且没有任意两个节点的标号是一样的。小Hi也瞅准了这个机会,重新巩固了一下小Ho关于二叉树遍历的基础知识~就这样,日子安稳的过了两天。

这天,小Ho正好在求解这棵二叉树的前序、中序和后序遍历的结果,但是却在求出前序遍历和中序遍历之后不小心把二叉树摔到了地上,小球和木棍等零件散落了一地!

小Ho损失了心爱的玩具,正要嚎啕大哭起来,所幸被小Hi发现了,劝说道:“别着急,这不是零件都还在么?拼起来不就是了?”

“可是我忘记了二叉树长什么样子了!”小Ho沮丧道。

“这个简单,你不是刚刚求出了这棵二叉树的前序和中序遍历的结果么,利用这两个信息就可以还原出整棵二叉树来哦!”

“这样么?!!”小Ho止住了泪水,问道:“那要怎么做呢?”

没错!小Ho在这一周遇到的问题便是:给出一棵二叉树的前序和中序遍历的结果,还原这棵二叉树并输出其后序遍历的结果。
提示:分而治之——化大为小,化小为无
输入

每个测试点(输入文件)有且仅有一组测试数据。

每组测试数据的第一行为一个由大写英文字母组成的字符串,表示该二叉树的前序遍历的结果。

每组测试数据的第二行为一个由大写英文字母组成的字符串,表示该二叉树的中序遍历的结果。

对于100%的数据,满足二叉树的节点数小于等于26。
输出

对于每组测试数据,输出一个由大写英文字母组成的字符串,表示还原出的二叉树的后序遍历的结果。
样例输入

AB
BA

样例输出

BA
#include<cstring>
#include<string>
#include<cstdio>
#include<iostream>
using namespace std;
string s1,s2;
void solve(string s1,string s2)
{
    char c=s1[0];
    int i=s2.find(c);
    if(i>0)
    {
        string str1=s1.substr(1,i);
        string str2=s2.substr(0,i);
        solve(str1,str2);
    }
     if(i<s2.length()-1)
    {
        string str3=s1.substr(i+1);
        string str4=s2.substr(i+1);
        solve(str3,str4);
    }
    cout<<c;
}
int main()
{
    cin>>s1>>s2;
    solve(s1,s2);
    cout<<endl;
    return 0;
}

题目2 : 最近公共祖先·一

描述

小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在其中,但这是为什么呢?

“为什么呢?”小Hi如是问道,在他的观察中小Ho已经沉迷这个网站一周之久了,甚至连他心爱的树玩具都弃置一边。

“嘿嘿,小Hi,你快过来看!”小Ho招呼道。

“你看,在这个对话框里输入我的名字,在另一个对话框里,输入你的名字,再点这个查询按钮,就可以查出来……什么!我们居然有同一个祖祖祖祖祖爷爷?”

“诶,真是诶……这个网站有点厉害啊。”小Hi不由感叹道。

“是啊,这是什么算法啊,这么厉害!”小Ho也附和道。

“别2,我说的是他能弄到这些数据很厉害,而人类的繁殖树这种层数比较浅的树对这类算法的要求可是简单的不得了,你都能写出来呢!”小Hi道。

“啊?我也能写出来?可是……该从哪开始呢?”小Ho困惑了。

小Ho要面临的问题是这样的,假设现在他知道了N个人的信息——他们的父亲是谁,他需要对于小Hi的每一次提问——两个人的名字,告诉小Hi这两个人的是否存在同一个祖先,如果存在,那么他们的所有共同祖先中辈分最低的一个是谁?

提示:不着急,慢慢来,另外我有一个问题:挖掘机技术哪家强?!
输入

每个测试点(输入文件)有且仅有一组测试数据。

每组测试数据的第1行为一个整数N,意义如前文所述。

每组测试数据的第2~N+1行,每行分别描述一对父子关系,其中第i+1行为两个由大小写字母组成的字符串Father_i, Son_i,分别表示父亲的名字和儿子的名字。

每组测试数据的第N+2行为一个整数M,表示小Hi总共询问的次数。

每组测试数据的第N+3~N+M+2行,每行分别描述一个询问,其中第N+i+2行为两个由大小写字母组成的字符串Name1_i, Name2_i,分别表示小Hi询问中的两个名字。

对于100%的数据,满足N<=102,M<=102, 且数据中所有涉及的人物中不存在两个名字相同的人(即姓名唯一的确定了一个人)。
输出

对于每组测试数据,对于每个小Hi的询问,输出一行,表示查询的结果:如果根据已知信息,可以判定询问中的两个人存在共同的祖先,则输出他们的所有共同祖先中辈分最低的一个人的名字,否则输出-1。
样例输入

11
JiaYan JiaDaihua
JiaDaihua JiaFu
JiaDaihua JiaJing
JiaJing JiaZhen
JiaZhen JiaRong
JiaYuan JiaDaishan
JiaDaishan JiaShe
JiaDaishan JiaZheng
JiaShe JiaLian
JiaZheng JiaZhu
JiaZheng JiaBaoyu
3
JiaBaoyu JiaLian
JiaBaoyu JiaZheng
JiaBaoyu LinDaiyu

样例输出

JiaDaishan
JiaZheng
-1
#include <bits/stdc++.h> 
using namespace std; 
const int maxn = 1e5 + 100; 
map<string,int> m;
int pre[maxn<<2]; 
void Union(int f,int s)
{ pre[s] = f; } 
int Query(int f,int s)
{ 
    vector<int> a,b; 
    int sf = f; 
    while(sf != pre[sf])
    { a.push_back(sf); sf = pre[sf]; } 
    a.push_back(pre[sf]); 
    int ss = s; 
    while(ss != pre[ss])
    { b.push_back(ss); ss = pre[ss]; } 
    b.push_back(pre[ss]); 
    unsigned int la = a.size(); 
    for(unsigned int i = 0;i < la; i++)
    { 
        if(find(b.begin(), b.end(), a[i]) != b.end())
        { return *find(b.begin(), b.end(), a[i]); } } 
        return -1; } 
        int main()
        { std::ios::sync_with_stdio(false);
        cin.tie(0); cout.tie(0); int N; cin >> N; 
        for(int i = 0;i <= N; i++){ pre[i] = i; }
        m.clear(); int id = 0; for(int i = 0;i < N; i++)
        { string fs, ss; cin >> fs >> ss; 
        if(!m.count(fs)) m[fs] = id++; 
        if(!m.count(ss)) m[ss] = id++; 
        Union(m[fs], m[ss]); } map<string, int> :: iterator w = m.begin(); 
        int Q; cin >> Q; for(int i = 0;i < Q; i++){ string a, b; cin >> a >> b; 
        if(a == b)
        { cout << a << endl; continue; } 
        else if(!m.count(a) || !m.count(b))
        { cout << -1 << endl; continue; } 
        int ans = Query(m[a], m[b]); 
        if(ans != -1){ map<string, int> :: iterator p = m.begin(); 
        while(p != m.end()){ if(p->second == ans){ break; } p++; } 
        cout << p->first << endl; } else cout << -1 << endl; } return 0; 
            
        }

猜你喜欢

转载自blog.csdn.net/qq_44391957/article/details/88069042