LeetCode 热题 100_二叉树的最大深度(37_104_简单_C++)(二叉树;递归;层次遍历)

LeetCode 热题 100_二叉树的最大深度(37_104)

题目描述:

给定一个二叉树 root ,返回其最大深度。

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

输入输出样例:

示例 1:

输入 :root = [3,9,20,null,null,15,7]
输出:3

示例 2:
输入 :root = [3,9,20,null,null,15,7]
输出:3

提示:

树中节点的数量在 [0, 10^4^] 区间内。

-100 <= Node.val <= 100

题解:

解题思路:

思路一(递归(深度优先)):

1、通过递归的返回过程,计算树的深度(nullptr结点深度为0,叶节点深度为1),从叶节点开始计算深度:max(l,r)+1。
本题官方题解链接(有递归过程图)
543.二叉树的直径:深度计算的视频讲解,感觉很不错(比本题官方题解讲的好)

2、复杂度分析:

① 时间复杂度:O(n),其中 n 为二叉树节点的个数。每个节点在递归中只被遍历一次。

② 空间复杂度:O(height),其中 height 表示二叉树的高度。递归函数需要栈空间,而栈空间取决于递归的深度,因此空间复杂度等价于二叉树的高度。

思路二(层次遍历(广度优先遍历)):

1、采用层次便利的方法,层次遍历故名思意就是采用从左到右的顺序从上到下,一层一层的遍历,每次遍历完一层结点将深度+1。

2、具体思路如下:

① 使用队列存储结点,从左到右将一层结点入队,记录此时的队列中元素的个数size。

② size个结点依次出队,同时将其存在的孩子结点依次入队(下一层结点入队),一层结点出队深度+1。

③ 重复上述过程直到队列为NULL。

3、复杂度分析

① 时间复杂度:O(n),其中 n 为二叉树的节点个数。与方法一同样的分析,每个节点只会被访问一次。

② 空间复杂度:此方法空间的消耗取决于队列存储的元素数量,其在最坏情况下会达到 O(n)。

代码实现

代码实现(思路一(递归(深度优先))):
cpp 复制代码
//方法一:递归的方式求书的最大深度
int maxDepth1(TreeNode *root){
    if (root==nullptr) return 0;
    return max(maxDepth1(root->left),maxDepth1(root->right))+1;
    
} 
代码实现(思路二(层次遍历(广度优先遍历))):
cpp 复制代码
//方法二:层次遍历求二叉树的最大深度
int maxDepth2(TreeNode *root){
    if (root==nullptr) return 0;
    queue<TreeNode *> Q;
    Q.push(root);
    int ans=0;
    
    while(!Q.empty()){
    	//size记录一层节点的个数
        int size=Q.size();
        //一次处理一层数据,将这层的孩子结点入队
        while (size>0)
        {
        	//一个结点出队
            TreeNode *node=Q.front();
            Q.pop();
            //其左右孩子不为空则入队
            if (node->left!=nullptr) Q.push(node->left);
            if(node->right!=nullptr) Q.push(node->right);
            //处理一个结点,size对应减小
            size-=1;
        }
        //处理一层结点后深度+1
        ans+=1;
    }
    return ans;
}
以思路一为例进行调试
cpp 复制代码
#include<iostream>
#include<queue>
using namespace std;

struct TreeNode
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode():val(0),left(nullptr),right(nullptr){}
    TreeNode(int x):val(0),left(nullptr),right(nullptr){}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};

//通过数组创建二叉树,-1代表结点为nullptr
TreeNode* createTree(vector<int> &a){
    if(a.empty()) return nullptr;
    TreeNode *root=new TreeNode(a[0]);
    queue<TreeNode *> Q;
    Q.push(root);
    int i=1;
    while (i<a.size())
    {
        TreeNode *node = Q.front();
        Q.pop();
        if(i<a.size()&&a[i]!=-1){
            node->left=new TreeNode(a[i]);
            Q.push(node->left); 
        }
        i++;
        if (i<a.size()&&a[i]!=-1){
            node->right=new TreeNode(a[i]);
            Q.push(node->right);
        }
        i++;
    }
    return root;
}

//方法一:递归的方式求书的最大深度
class Solution
{
public:
    //方法一:递归的方式求书的最大深度
    int maxDepth1(TreeNode *root){
		if (root==nullptr) return 0;
        return max(maxDepth1(root->left),maxDepth1(root->right))+1;
	} 
};

int main(){
    vector<int> a={1, 2, 3, 4, 5, -1, 6};
    //创建二叉树
    TreeNode *root=createTree(a);
    Solution s;
    //计算二叉树的最大深度并输出
    cout<<s.maxDepth1(root);
    return 0;
}

LeetCode 热题 100_二叉树的最大深度(37_104)原题链接

欢迎大家和我沟通交流(✿◠‿◠)

相关推荐
刘好念11 分钟前
[OpenGL]使用glsl实现smallpt
c++·计算机图形学·opengl·glsl
Andy℡。14 分钟前
数值计算期末考试重点(三)(黄云清版教材)【未更完】
算法
HappyAcmen3 小时前
机器算法之逻辑回归(Logistic Regression)详解
算法·机器学习·逻辑回归
get_money_4 小时前
代码随想录Day37 动态规划:完全背包理论基础,518.零钱兑换II,本周小结动态规划,377. 组合总和 Ⅳ,70. 爬楼梯(进阶版)。
java·笔记·算法·动态规划
get_money_4 小时前
代码随想录38 322. 零钱兑换,279.完全平方数,本周小结动态规划,139.单词拆分,动态规划:关于多重背包,你该了解这些!背包问题总结篇。
java·开发语言·笔记·算法·动态规划
mahuifa5 小时前
C++(Qt)软件调试---VS性能探查器(27)
c++·qt·内存泄漏·vs性能探查器·cpu性能分析
天马行空_5 小时前
周记-唐纳德的《计算机程序设计艺术》
c++
jackiendsc6 小时前
雪花算法(Snowflake algorithm)介绍、优缺点及代码示例
算法·html·dreamweaver
冀晓武7 小时前
C++ 设计模式:观察者模式(Observer Pattern)
c++·观察者模式·设计模式
捕鲸叉7 小时前
C++设计模式之行为型模式概述,它们的目的与特点
c++·设计模式