百练4081:树的转换题解

xiaoxiao2021-02-28  93

4081:树的转换

查看提交统计提示提问 总时间限制:  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是转换后树的高度。 样例输入 dudduduudu 样例输出 2 => 4

查看  提交  统计  提示  提问 代码: #include<cstdio> #include<cstring> #define MAX(a,b) ((a)>(b)?(a):(b)) const int N = 100100; char s[N]; int res1=-1,res2 = -1,i=0; void dfs(int &i, int dep1,int dep2){ res1 = MAX(res1,dep1); res2 = MAX(res2,dep2); int cnt = 1; while(s[i]){ if(s[i] == 'd') dfs(++i,dep1+1,dep2+cnt),cnt++; else{ i++; return; } } } int main(){ scanf("%s",s); dfs(i,0,0); printf("%d => %d\n",res1,res2); return 0; }

转载请注明原文地址: https://www.6miu.com/read-70092.html

最新回复(0)