输入一串二叉树,输出其前序遍历。
第一行为二叉树的节点数 n。(1 <= n <= 26)
后面 n 行,每一个字母为节点,后两个字母分别为其左右儿子。特别地,数据保证第一行读入的节点必为根节点。
空节点用 `*` 表示
二叉树的前序遍历。
### 样例输入 #1
```
6
abc
bdi
cj*
d**
i**
j**
```
### 样例输出 #1
```
abdicj
```
根据他给的数据建立一个树。然后按前序输出(根,左,右)。
#include
using namespace std;
struct ss
{
char c;
struct ss *l;
struct ss *r;
}g;
char j[50][3];
int n;
struct ss* chu(char c) //建立树
{
struct ss *p;
int x;
p=(struct ss*)malloc(sizeof(g));
for(x=0;xc=j[x][0];
if(j[x][1]=='*') //建立左树
p->l=NULL;
else
p->l=chu(j[x][1]);
if(j[x][2]=='*') //建立右树
p->r=NULL;
else
p->r=chu(j[x][2]);
return p;
}
int p(struct ss *h) //前序输出
{
printf("%c",h->c);
if(h->l!=NULL)
p(h->l);
if(h->r!=NULL)
p(h->r);
return 0;
}
int main()
{
int x,y;
struct ss *h;
scanf("%d",&n);
for(x=0;x
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,且二叉树的节点个数 8)。
共两行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
共一行一个字符串,表示一棵二叉树的先序。
### 样例输入 #1
```
BADC
BDCA
```
### 样例输出 #1
```
ABCD
```
利用中序(左,根,右)和后序(左,右,根)。
#include
using namespace std;
char g[30];
char j[30];
int n;
int chu(int l,int r)
{
int x,y;
if(l>r)
return 0;
for(x=n-1;x>=0;x--)
{
for(y=l;y<=r;y++)
{
if(g[x]==j[y])
break;
}
if(y<=r)
break;
}
printf("%c",j[y]);
chu(l,y-1);
chu(y+1,r);
return 0;
}
int main()
{
scanf("%s%s",j,g);
n=strlen(g);
chu(0,n-1);
return 0;
}
有一个 n(n <= 10^6) 个结点的二叉树。给出每个结点的两个子结点编号(均不超过 n),建立一棵二叉树(根节点的编号为 1),如果是叶子结点,则输入 `0 0`。
建好这棵二叉树之后,请求出它的深度。二叉树的**深度**是指从根节点到叶子结点时,最多经过了几层。
第一行一个整数 n,表示结点数。
之后 n 行,第 i 行两个整数 l、r,分别表示结点 i 的左右子结点编号。若 l=0 则表示无左子结点,r=0 同理。
一个整数,表示最大结点深度。
### 样例输入 #1
```
7
2 7
3 6
4 5
0 0
0 0
0 0
0 0
```
### 样例输出 #1
```
4
```
根据题目所给的数据建立树,然后全部遍历一遍,用一个全局变量存最大值。
#include
using namespace std;
struct ss
{
int c;
struct ss *l;
struct ss *r;
}g;
int j[1000001][2];
int n,min1;
struct ss* shu(int k) //建立树
{
int x;
struct ss *p;
p=(struct ss*)malloc(sizeof(g));
p->c=k;
if(j[k][0]!=0)
p->l=shu(j[k][0]);
else
p->l=NULL;
if(j[k][1]!=0)
p->r=shu(j[k][1]);
else
p->r=NULL;
return p;
};
int shen(struct ss *p,int h) //遍历找出最大值
{
if(h>min1)
min1=h;
if(p->l!=NULL)
{
shen(p->l,h+1);
}
if(p->r!=NULL)
{
shen(p->r,h+1);
}
return 0;
}
int main()
{
int x,y;
struct ss *h;
scanf("%d",&n);
for(x=1;x<=n;x++)
scanf("%d%d",&j[x][0],&j[x][1]);
h=shu(1);
shen(h,1);
printf("%d",min1);
return 0;
}
如题,现在有一个并查集,你需要完成合并和查询操作。
第一行包含两个整数 N,M ,表示共有 N 个元素和 M 个操作。
接下来 M 行,每行包含三个整数 Zi,Xi,Yi 。
当 Zi=1 时,将 Xi 与 Yi 所在的集合合并。
当 Zi=2 时,输出 Xi 与 Yi 是否在同一集合内,是的输出
`Y` ;否则输出 `N` 。
对于每一个 Zi=2 的操作,都有一行输出,每行包含一个大写字母,为 `Y` 或者 `N` 。
### 样例输入 #1
```
4 7
2 1 2
1 1 2
2 1 2
1 3 4
2 1 4
1 2 3
2 1 4
```
### 样例输出 #1
```
N
Y
N
Y
```
对于 30% 的数据,N <= 10,M <= 20。
对于 70% 的数据,N <= 100,M <= 10^3。
对于 100% 的数据,1<= N <= 10^4,1<= M <= 2* 10^5,1 <= Xi, Yi <= N。
这道题我用的是数组来实现的,将以上的数据进行模拟一边就行了,注意要把树进行路径压缩(就是:一个元素本要向上找很多层才能找到根节点,我们把他的上层直接变成根节点)。
#include
using namespace std;
int g[10001];
int main()
{
int x,y,z,n,m,a,b,c;
scanf("%d%d",&n,&m);
for(x=1;x<=n;x++)
g[x]=x;
for(x=0;x
今天又重新看了一边二叉树并写了几道题目,比昨天好很多了。还了解了并查集的定义并做了一道基本题