请按一下要求编写一段c语言代码:总时间限制: 5000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB 描述 我们都知道用“左儿子右兄弟”的方法可以将一棵一般的树转换为二叉树,如: 0 0 / | \ / 1 2 3 ===> 1 / \ \ 4 5 2 / \ 4 3 \ 5 现在请你将一些一般的树用这种方法转换为二叉树,并输出转换前和转换后树的高度。 输入 输入是一个由“u”和“d”组成的字符串,表示一棵树的深度优先搜索信息。比如,dudduduudu可以用来表示上文中的左树,因为搜索过程为:0 Down to 1 Up to 0 Down to 2 Down to 4 Up to 2 Down to 5 Up to 2 Up to 0 Down to 3 Up to 0。 你可以认为每棵树的结点数至少为2,并且不超过10000。 输出 按如下格式输出转换前和转换后树的高度: h1 => h2 其中,h1是转换前树的高度,h2是转换后树的高度。
时间: 2023-07-14 09:13:40 浏览: 125
以下是针对该问题的 C 语言代码实现:
```c
#include <stdio.h>
#define MAX_N 10000
int n, idx;
int head[MAX_N + 5], dep[MAX_N + 5], fa[MAX_N + 5], son[MAX_N + 5], siz[MAX_N + 5];
struct Edge {
int to, nxt;
} e[MAX_N << 1];
inline void addEdge(int u, int v) {
e[++idx].to = v, e[idx].nxt = head[u], head[u] = idx;
}
void dfs(int u, int pre) {
fa[u] = pre, siz[u] = 1;
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (v == pre) continue;
dep[v] = dep[u] + 1;
dfs(v, u);
siz[u] += siz[v];
if (siz[v] > siz[son[u]]) son[u] = v;
}
}
void printHeight() {
int height1 = 0, height2 = 0;
for (int i = 1; i <= n; ++i) {
height1 = dep[i] > height1 ? dep[i] : height1;
height2 = fa[i] != -1 ? height2 : dep[i];
}
printf("%d => %d\n", height1, height2);
}
void treeToBinary(int u, int pre) {
if (son[u]) {
int v = son[u];
for (int i = head[u]; i; i = e[i].nxt) {
int w = e[i].to;
if (w == pre || w == v) continue;
int t = v;
v = w;
while (son[v]) {
int x = son[v];
son[v] = t, t = v, v = x;
}
son[v] = t;
}
treeToBinary(v, u);
}
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (v == pre || v == son[u]) continue;
treeToBinary(v, u);
}
}
int main() {
char s[MAX_N + 5];
scanf("%s", s + 1);
n = 0;
for (int i = 1; s[i]; ++i) {
if (s[i] == 'u') fa[++n] = -1;
else {
addEdge(n, ++n);
addEdge(n - 1, n);
}
}
dep[1] = 1;
dfs(1, -1);
treeToBinary(1, -1);
printHeight();
return 0;
}
```
该代码先使用“左儿子右兄弟”的方式将一棵一般的树转换为二叉树,然后分别计算转换前和转换后树的高度并输出。
阅读全文