24-1-25预备役之第五次总结

​​​​​1:[USACO3.4] 美国血统 American Heritage 

https://www.luogu.com.cn/problem/P1827

 思路:根据前序排列确定前序排列的根节点,并用递归去不断分割左子树和右子树,

直到最底层节点终止分割,此时打印此根节点,如此不断回溯。详细见c代码如下:


#include<stdio.h>
#include<string.h>
char a[30], b[30];
void dfs(int al, int ar, int bl, int br)//先  中
{
    int bk;//中节点

    for (int i = bl; i < br; i++)
    {
        if (b[i] == a[al])
        {
            bk = i;
            break;
        }
    }
    int ln = bk - bl;
    int rn = br - (bk + 1);
    if (ln > 0)
    {
        dfs(al + 1, al + 1 + ln, bl, bl + ln);
    }
    if (rn > 0)
    {
        dfs(ar - rn, ar, bk + 1, bk + 1 + rn);
    }
    printf("%c", a[al]);
    return;
}
int main()
{
    scanf("%s", b);
    scanf("%s", a);
    int l = strlen(a);
    dfs(0, l, 0, l);
    return 0;
}

2:P1305 新二叉树

https://www.luogu.com.cn/problem/P1827

思路:是前序,中序,后序,知道其中两者求另外一者的套路,都要能灵活掌握

#include<stdio.h>
int n;
char a[30][3];
void fun(char x)
{
    if (x != '*')
    {
        printf("%c", x);
        for (int i = 1; i <= n; i++)
        {
            if (a[i][0] == x)
            {
                fun(a[i][1]);
                fun(a[i][2]);
            }
        }
    }
    return;
}
int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
    {
        scanf("%s", &a[i]);
    }
    fun(a[1][0]);
    return 0;
}
 

3:P1030 [NOIP2001 普及组] 求先序排列

https://www.luogu.com.cn/problem/P1827

 思路:跟总统那题差不多,直接看码吧

#include<stdio.h>
#include<string.h>
char b[20], c[20];
int l;
void work(int bl, int br, int cl, int cr)
{
    printf("%c", c[cr - 1]);
    int bk;
    for (int i = bl; i < br; i++)
    {
        if (b[i] == c[cr - 1])
        {
            bk = i;
            break;
        }
    }
    int ln = bk - bl;//左子树节点个数
    int rn = br - 1 - bk;//右子树节点个数
    if (ln > 0)
    {
        work(bl, bl + ln, cl, cl + ln);
    }
    if (rn > 0)
    {
        work(bk + 1, bk + 1 + rn, cr - 1 - rn, cr - 1);
    }
}
int main()
{
    scanf("%s", b);
    scanf("%s", c);
    l = strlen(b);
    work(0, l, 0, l);
    return 0;
}
 

4:P4913 【深基16.例3】二叉树深度

https://www.luogu.com.cn/problem/P1827


思路:找到从根节点到最远叶子节点的最长路径长度。
1. **初始化**:定义一个结构体`node`来表示二叉树的节点,包含左右子节点的编号。定义一个全局变量`ans`来记录最长路径长度,初始化为-1。定义一个`max`函数来返回两个整数中的较大值。
2. **深度优先搜索**:定义一个`dfs`函数来进行深度优先搜索遍历二叉树。该函数接受当前节点编号`pos`和当前深度`deep`作为参数。在函数中,首先检查是否到达空节点(即节点编号为0),如果是,则返回;否则,更新`ans`为当前深度和`ans`中的较大值。然后,递归地调用`dfs`函数访问左子节点和右子节点,每次递归调用时,深度`deep`加1。        详细见代码如下:

#include<stdio.h>
struct node {
    int l, r;        //左节点  右节点
}tree[1000005];
int ans = -1;
int max(int a, int b)
{
    return (a > b ? a : b);
}
void dfs(int pos, int deep)
{
    //终止条件
    if (pos == 0)return;
    ans = max(ans, deep);
    //到哪
    dfs(tree[pos].l, deep + 1);
    dfs(tree[pos].r, deep + 1);
}
int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &tree[i].l);
        scanf("%d", &tree[i].r);
    }
    dfs(1, 1);
    printf("%d", ans);
    return 0;
}
 

//又想玩游戏 学习了 哎

 

 不行,不能太委屈自己了

  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2023-11-21始写

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值