一.上午(3.5h)
重新看了看昨天敲的代码的思路,我发现虽然我之前敲对了,但是我的思路没有那么清晰,导致我写差不多题目的时候还是不能成功敲出,我就自己又重新敲了一遍之前敲过的代码
二.下午晚上(5.5h)
接着题组往下刷
先介绍一个函数,后面有用到。
1.关于substr函数的用法
substr()方法用于字符串的截取
两个参数用法:
字符串.substr(参数1,参数2)
1
参数1(可以是0、正整数、负数)
参数1:
如果是0或正整数,则代表字符串截取的起始下标
如果是负数,则代表从倒数第几个字符开始截取
参数2:
字符串截取字符的个数(正整数)
如果是0或负数,则会返回空字符串
示例: var str="abcdefghijklmn";
var res=str.substr(2,5);
结果为res:"cdefg"
var str1="abcdefghijklmn";
var res1=str1.substr(-5,2);
结果为res1:"jk"
1
2
3
4
5
6
7
1个参数用法:
字符串.substr(参数);
1
参数:
如果是0或正整数:字符串截取的起始下标,默认截取至字符串结尾
如果是负数:则从倒数第几个字符开始截取,默认截取至字符串结尾
示例: var str="abcdefghijklmn";
var res=str.substr(2);
结果为res:"cdefghijklmn"
var str1="abcdefghijklmn";
var res1=str1.substr(-2);
结果为res1:"mn"
2.
题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度\le 8≤8)。
输入格式
2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出格式
1行,表示一棵二叉树的先序。
输入输出样例
输入 #1复制
BADC BDCA
输出 #1复制
ABCD
思路:
#include<bits/stdc++.h>
using namespace std;
void fun(string in,string af)
{
int k;
if(in.size()>0)
{
char ch=af[af.size()-1];
cout<<ch;//找出根
k=in.find(ch);
fun(in.substr(0,k),af.substr(0,k));//递归左子树
fun(in.substr(k+1),af.substr(k,in.size()-k-1));//递归右子树
}
}
int main()
{
string in,af;
cin>>in;//中序
cin>>af;//后序
fun(in,af);
return 0;
}
3.遍历问题
题目描述
我们都很熟悉二叉树的前序、中序、后序遍历,在数据结构中常提出这样的问题:已知一棵二叉树的前序和中序遍历,求它的后序遍历,相应的,已知一棵二叉树的后序遍历和中序遍历序列你也能求出它的前序遍历。然而给定一棵二叉树的前序和后序遍历,你却不能确定其中序遍历序列,考虑如下图中的几棵二叉树:
所有这些二叉树都有着相同的前序遍历和后序遍历,但中序遍历却不相同。
输入格式
输A数据共两行,第一行表示该二叉树的前序遍历结果s1,第二行表示该二叉树的后序遍历结果s2。
输出格式
输出可能的中序遍历序列的总数,结果不超过长整型数。
输入输出样例
输入 #1复制
abc cba
输出 #1复制
4
思路:
只有 前和 后 那么主要问题就是没有办法处理只有一个子树の情况,因为 这种情况 不知道子树 究竟是这个节点的左子树还是右子树,也就是说其实这道题要判断遍历中存在着多少个只有一棵子树的情况。对于前,如果一个结点的下个结点等于后中对应结点的前一个结点的话,那么这个结点就是根节点且其只有一个子树。sum初始化为1,出现一个只有一棵子树的情况,就把sum*2(每次会出现两种不同的情况,分别是出现左子树和出现右子树)。
#include<bits/stdc++.h>
using namespace std;
int main()
{
char a[300],b[300];
cin>>a;//输入
cin>>b;
int ans=1;
for(int i=0;i<=strlen(a)-2;i++)
{
for(int j=0;j<=strlen(a)-1;j++)
{
if(b[j]==a[i]&&b[j-1]==a[i+1])//判断是否只有一个叶子
ans*=2;
}
}
cout<<ans;
}
4.深度问题
题目描述
给出每个节点的两个儿子节点,建立一棵二叉树(根节点为 11),如果是叶子节点,则输入0 0
。建好树后希望知道这棵二叉树的深度。二叉树的深度是指从根节点到叶子结点时,最多经过了几层。
最多有 10^6106 个结点。
输入格式
无
输出格式
无
输入输出样例
输入 #1复制
7 2 7 3 6 4 5 0 0 0 0 0 0 0 0
输出 #1复制
4
这道题感觉比较简单,就先建树然后遍历一遍就行。
#include<bits/stdc++.h>
using namespace std;
//定义一个树的左右节点
struct node{
int l;
int r;
}tree[1000010];
int ans;
void dfs(int now,int deep)
{
if(now==0)
return ;
ans=max(ans,deep);
dfs(tree[now].l,deep+1);//往左边遍历
dfs(tree[now].r,deep+1);//往右边遍历
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)//输入
cin>>tree[i].l>>tree[i].r;
dfs(1,1);
cout<<ans;
}