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;
}
//又想
玩游戏学习了 哎
不行,不能太委屈自己了