【题目链接】
【题目考点】
1. 二叉树
【解题思路】
解法1:递归
- 递归问题:求一棵二叉树的深度
- 递归关系:一棵二叉树的深度,是其左子树深度和右子树深度的较大值再加1。
- 递归出口:一棵空树的深度为0
解法2:深搜
搜索时,带一个参数表示当前的层数,每搜索深入一层,该层数加1。如果该结点是叶子结点,那么更新最大层次数(也可以搜索到任意结点时都一次更新),最后输出最大层次数。
【题解代码】
解法1:递归
#include <bits/stdc++.h>
using namespace std;
#define N 1000005
struct Node
{
int left, right;
};
Node tree[N];
int p;
int getDepth(int r)
{
if(r == 0)
return 0;
return max(getDepth(tree[r].left), getDepth(tree[r].right)) + 1;
}
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; ++i)
cin >> tree[i].left >> tree[i].right;
cout << getDepth(1);
return 0;
}
解法2:深搜
- 写法1:搜索到叶子结点时更新最大深度
#include <bits/stdc++.h>
using namespace std;
#define N 1000005
struct Node
{
int left, right;
};
Node tree[N];
int p, mxDepth;//mxDepth:最大深度
void dfs(int r, int depth)//搜索到地址为r的结点时,深度为depth
{
if(r == 0)
return;
if(tree[r].left == 0 && tree[r].right == 0)//如果地址为r的结点是叶子结点,那么更新最大深度
{
mxDepth = max(mxDepth, depth);
return;
}
dfs(tree[r].left, depth+1);
dfs(tree[r].right, depth+1);
}
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; ++i)
cin >> tree[i].left >> tree[i].right;
dfs(1, 1);//根结点深度为1
cout << mxDepth;
return 0;
}
- 写法2:搜索到任意结点时都更新最大深度
#include <bits/stdc++.h>
using namespace std;
#define N 1000005
struct Node
{
int left, right;
};
Node tree[N];
int p, mxDepth;//mxDepth:最大深度
void dfs(int r, int depth)//搜索到地址为r的结点时,深度为depth
{
if(r == 0)
return;
mxDepth = max(mxDepth, depth);//更新最大深度
dfs(tree[r].left, depth+1);
dfs(tree[r].right, depth+1);
}
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; ++i)
cin >> tree[i].left >> tree[i].right;
dfs(1, 1);//根结点深度为1
cout << mxDepth;
return 0;
}