原題連結:https://www.luogu.com.cn/problem/P4913
題意解讀:計算二叉樹的深度
解題思路:
首先介紹二叉樹的儲存方式,對於本題,直接用陣列模擬,陣列的下標即節點號
struct node
{
int l, r;
} tree[N];
tree[i].l存的是節點i的左子結點,tree[i].r存的是節點i的右子節點。
計算深度至少有三種方法:遞迴、DFS、BFS,下面主要介紹前兩種方法:
1、遞迴
從二叉樹深度的定義出發,給定一個根節點,根節點以下的最大深度等於左子樹的最大深度、右子樹的最大深度中較大者,
樹的深度再加1即可,用遞迴的定義就是:
depth(root) = max(depth(root->left), depth(root->right)) + 1
100分程式碼:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
struct node
{
int l, r;
} tree[N];
int n;
int depth(int root)
{
if(root == 0) return 0;
return max(depth(tree[root].l), depth(tree[root].r)) + 1;
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> tree[i].l >> tree[i].r;
}
cout << depth(1);
return 0;
}
2、DFS
從根節點出發,針對左、右子節點進行DFS,每DFS遞迴呼叫一次,深度都+1,記錄這個過程中深度最大值即可。
100分程式碼:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
struct node
{
int l, r;
} tree[N];
int ans, n;
void dfs(int root, int depth)
{
if(root == 0) return;
ans = max(ans, depth);
dfs(tree[root].l, depth + 1);
dfs(tree[root].r, depth + 1);
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> tree[i].l >> tree[i].r;
}
dfs(1, 1);
cout << ans;
return 0;
}