求解二叉树深度…这样太。。刚才我做的题中就有啊
好吧,还是有点难度的,毕竟这道题的输入数据很。人性化。
也就是说规则有点模糊?我们还是想办法确定一下数据结构好了。
特殊点
1.只要有儿子,必定有两个
2.从左到右给儿子
3.如果是0没儿子
难点:确定合适数据结构储存输入数据
用队列!
因为他的子节点是按照顺序给的,
从上到下,从左到右,
所以先到先得,我们只需要使用一个队列,
让非0结点入队即可。
而且不断更新grade数组的值
好的,当前80分,有一道题出错了,我需要猜想我的逻辑不全面的地方
到底是怎样的偏怪数据会造成这样的错误呢?
1.改正,grade[head]没有任何意义,但是没想到拿了80分?
grade[a]=grade[line[head]]+1;
grade[b]=grade[line[head]]+1;
改正之后0分?
完全没问题啊?
难不成我题意理解有问题?万万没想到啊?
查看题解,我就这样了,有点生气,题意描述的是不是有点不清楚啊
果然是我理解错题意了,果然还是不要浪费时间比较好
气死了
这道题的输入数据:
1.一个整数,结点总数量
2.n行,分别表示编号1到n结点的子节点数
那直接深搜就好了,呵呵
不过感觉我这样理解也可以用来出一道题了哈哈。
用一个结构体数组,下标就是结点编号,然后内部就是左右字节点编号,最后直接从1结点深搜即可。没劲。。
好吧,我用dfs(1,1)竟然最后的出来是5,看来又有逻辑出现错误?
没错误,合着又是我理解错了????????
原来0代表的是没有儿子,而不是不可以有儿子的叶节点啊!
哈哈哈哈哈
自闭
上代码
#include<stdio.h>
typedef struct
{
int l,r;
}Tree;
Tree tree[1000005];
int n,depth=0;
void dfs(int node,int dep);
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d %d",&tree[i].l,&tree[i].r);
}
//深搜
dfs(1,1);
printf("%d",depth);
return 0;
}
void dfs(int node,int dep)
{
// printf("node=%d,dep=%d\n",node,dep);
//每次结点等于0的时候说明到底了,进行比较之后返回即可
if(node==0)
{
return ;
}
if(dep>depth)
{
depth=dep;
}
dfs(tree[node].l,dep+1);
dfs(tree[node].r,dep+1);
return ;
}