学习总结9

# 新二叉树

## 题目描述

输入一串二叉树,输出其前序遍历。

## 输入格式

第一行为二叉树的节点数 n。(1 <= n <= 26)

后面 n 行,每一个字母为节点,后两个字母分别为其左右儿子。特别地,数据保证第一行读入的节点必为根节点。

空节点用 `*` 表示

## 输出格式

二叉树的前序遍历。

## 样例 #1

### 样例输入 #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

# [NOIP2001 普及组] 求先序排列

## 题目描述

给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,且二叉树的节点个数  8)。

## 输入格式

共两行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。

## 输出格式

共一行一个字符串,表示一棵二叉树的先序。

## 样例 #1

### 样例输入 #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;
}

# 【深基16.例3】二叉树深度

## 题目描述

有一个 n(n <= 10^6) 个结点的二叉树。给出每个结点的两个子结点编号(均不超过 n),建立一棵二叉树(根节点的编号为 1),如果是叶子结点,则输入 `0 0`。

建好这棵二叉树之后,请求出它的深度。二叉树的**深度**是指从根节点到叶子结点时,最多经过了几层。

## 输入格式

第一行一个整数 n,表示结点数。

之后 n 行,第 i 行两个整数 l、r,分别表示结点 i 的左右子结点编号。若 l=0 则表示无左子结点,r=0 同理。

## 输出格式

一个整数,表示最大结点深度。

## 样例 #1

### 样例输入 #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

### 样例输入 #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

今日总结

今天又重新看了一边二叉树并写了几道题目,比昨天好很多了。还了解了并查集的定义并做了一道基本题

你可能感兴趣的:(学习,算法)