洛谷題單指南-二叉樹-P4913 【深基16.例3】二叉樹深度

江城伍月發表於2024-03-14

原題連結: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;
}

相關文章