算法最优解 算法最优解
首页
目录
赞助
GitHub (opens new window)
首页
目录
赞助
GitHub (opens new window)
  • 数据结构基础

  • 数组

  • 位运算

  • 动态规划

  • 图

  • 区间

  • 链表

  • 矩阵

  • 字符串

  • 树

    • 二叉树的最大深度
      • 题目描述
      • 思路解析
        • 方法一 递归法
        • C++代码
        • 复杂度分析
        • 方法二 广度优先(BFS)
        • C++代码
        • 复杂度分析
        • 方法三 深度优先(DFS)
        • C++代码
        • 复杂度分析
    • 相同的树
    • 翻转二叉树
    • 二叉树中的最大路径和
    • 二叉树的层序遍历
    • 二叉树的序列化与反序列化
    • 另一棵树的子树
    • 从前序与中序遍历序列构造二叉树
    • 验证二叉搜索树
    • 二叉搜索树中第K小的元素
    • 二叉搜索树的最近公共祖先
    • 实现 Trie (前缀树)
    • 添加与搜索单词 - 数据结构设计
    • 单词搜索 II
  • 堆

  • 逻辑思维

  • 目录
  • 树
华南溜达虎
2024-07-08
目录

二叉树的最大深度

题目链接: https://leetcode.cn/problems/maximum-depth-of-binary-tree/

# LeetCode 104. 二叉树的最大深度

# 题目描述

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

举个例子:

给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回它的最大深度 3 。

# 思路解析

# 方法一 递归法

递归的关键是将问题分解成独立的子问题。

如上图所示,以root为根节点树的高度 可以分解成 以root->left为根节点树的高度depth1 和 以root->right为根节点树的高度depth2 中的较大值加一,即max{depth1, depth2} + 1。

递归是函数一层一层调用的过程,函数调用实际上是一个入栈出栈的过程,这里的栈就是函数调用栈,你可以用gdb调试一个程序通过bt命令来查看函数调用栈。这里的递归函数是maxDepth,它的入参是树的根节点,返回值是树的高度。

# C++代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int maxDepth(TreeNode* root) {
        
        if (!root) {
            return 0;
        }

        return 1 + max(maxDepth(root->left), maxDepth(root->right)); 

    }
};

# 复杂度分析

时间复杂度: 递归需要遍历整棵树所以时间复杂度和树的总节点数相关。

空间复杂度: 递归需要利用函数调用栈来保存函数,其栈的最大长度和树的高度相关。

# 方法二 广度优先(BFS)

广度优先搜索(BFS) 是一种图形搜索算法,它的基本思想是从一个顶点出发,先访问它的所有邻接顶点,然后再按照同样的方式访问这些邻接顶点的未访问邻接顶点,直到图中所有顶点都被访问。广度优先搜索算法通常使用队列来存储待访问的顶点,并使用一个数组或者集合来记录已访问的顶点。

广度优先搜索同样可以应用到树的搜索中,具体流程参考下面的代码。

# C++代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int maxDepth(TreeNode* root) {
        
        if (!root) {
            return 0;
        }

        int depth = 0;
        queue<pair<TreeNode*,int>> q;
        q.push({root,1});
        while (!q.empty()) {
            auto temp = q.front();
            q.pop();
            depth = max(depth, temp.second);
            if (temp.first->left) {
                q.push({temp.first->left, temp.second + 1});
            }
            if (temp.first->right) {
                q.push({temp.first->right, temp.second + 1});
            }
        } 
        return depth;
    }
};

# 复杂度分析

时间复杂度: 广度优先需要遍历整棵树所以时间复杂度和树的总节点数相关。

空间复杂度: 广度优先利用队列来保存树的节点,其空间复杂度也是和树的最后一层的节点数相关。

# 方法三 深度优先(DFS)

深度优先搜索(Depth-First Search,DFS)是一种常见的图遍历算法,它从图的某个顶点开始遍历,沿着一条路径一直走到底,直到不能再走为止,然后回溯到前一个节点,继续沿着另一条路径走到底,直到所有的节点都被访问过为止。

在实现深度优先搜索时,可以使用递归或栈来保存遍历的路径。具体来说,从起始节点开始,将其标记为已访问,然后遍历与该节点相邻的未访问节点,对于每个未访问节点,递归调用深度优先搜索函数,直到所有与起始节点相连的节点都被访问过为止。

深度优先搜索同样可以应用到树的搜索中,具体流程参考下面的代码。

# C++代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int maxDepth(TreeNode* root) {
        
        if (!root) {
            return 0;
        }

        int depth = 0;
        stack<pair<TreeNode*,int>> s;
        s.push({root,1});
        while (!s.empty()) {
            auto temp = s.top();
            s.pop();
            depth = max(depth, temp.second);
            if (temp.first->left) {
                s.push({temp.first->left, temp.second + 1});
            }
            if (temp.first->right) {
                s.push({temp.first->right, temp.second + 1});
            }
        } 
        return depth;
    }
};

# 复杂度分析

时间复杂度: 深度优先需要遍历整棵树所以时间复杂度和树的总节点数相关。

空间复杂度: 深度优先利用栈来保存树的节点,其空间复杂度也是和树的高度相关。

上次更新: 2024/07/08, 20:31:33
回文子串
相同的树

← 回文子串 相同的树→

Theme by Vdoing | Copyright © 2024-2024 华南溜达虎 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式