day16 二叉树的最大深度 n叉树的最大深度 二叉树的最小深度 完全二叉树的节点数

题目1:104 二叉树的最大深度

题目链接:104 二叉树的最大深度

题意

二叉树的根节点是root,返回其最大深度(从根节点到最远叶子节点的最长路径上的节点数)

递归

根节点的的高度就是二叉树的最大深度  所以使用后序遍历求最大高度的方式求出最大深度

递归三部曲

1)确定递归函数的参数和返回值

2)确定终止条件

3)确定单层递归的逻辑

代码

/**
 * 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 result;
    int maxDepth(TreeNode* root) {
       //终止条件
       if(root==NULL) return 0;
       //单层递归逻辑  后序遍历 左右中
       int leftheight = maxDepth(root->left);//左
       int rightheight = maxDepth(root->right);//右
       int height = 1 + max(leftheight,rightheight);
       return height;
    }
};

层序遍历

最大深度就是判断二叉树有几层

代码

/**
 * 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 result;
    int maxDepth(TreeNode* root) {
        queue<TreeNode*> que;
        if(root!=NULL) que.push(root);
        int count = 0;
        while(!que.empty()){
            int size = que.size();
            while(size--){
                TreeNode* node = que.front();
                que.pop();
                if(node->left) que.push(node->left);
                if(node->right) que.push(node->right);
            }
            count++;
        }
        return count;   
    }
};
逻辑
例1:层次遍历只能使用队列不能使用栈,以下是使用栈的反例

题目2:559 n叉树的最大深度

题目链接:555 n叉树的最大深度

题意

n叉树的最大深度

递归(难)

代码

/*
// Definition for a Node.
class Node {
public:
    int val;
    vector<Node*> children;

    Node() {}

    Node(int _val) {
        val = _val;
    }

    Node(int _val, vector<Node*> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
public:
    int maxDepth(Node* root) {
        //终止条件
        if(root==NULL) return 0;
        //单层递归逻辑  后序遍历  左右中
        int depth = 0;
        for(int i=0;i<root->children.size();i++){
            depth = max(depth,maxDepth(root->children[i]));
            cout<<"node:"<<root->children[i]->val<<endl;;
            cout<<"depth:"<<depth<<endl;
        }
        return depth+1;
    }
};

层序遍历

一个node可能有多个孩子

代码

/*
// Definition for a Node.
class Node {
public:
    int val;
    vector<Node*> children;

    Node() {}

    Node(int _val) {
        val = _val;
    }

    Node(int _val, vector<Node*> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
public:
    int maxDepth(Node* root) {
        queue<Node*> que;
        if(root!=NULL) que.push(root);
        int count = 0;
        while(!que.empty()){
            int size = que.size();
            while(size--){
                Node* node = que.front();
                que.pop();
                //一个node可能有多个海泽
                for(int i=0;i<node->children.size();i++){
                    if(node->children[i]) que.push(node->children[i]);
                }
            }
            count++;
        }
        return count;
    }
};

题目3:111 二叉树的最小深度

题目链接:111 二叉树的最小深度

题意

根据二叉树的根节点root,找出其最小深度(根节点到最近叶子节点的路径上的节点数量)

递归

递归三部曲:

1)确定递归函数的返回值和参数

2)确定终止条件

3)确定单层递归逻辑

左子树为空,右子树不为空,最小深度是1+右子树的深度

左子树不为空,右子树为空,最小深度是1+左子树的深度

左子树不为空,右子树也不为空,最小深度是左右子树深度最小值+1

代码

/**
 * 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 minDepth(TreeNode* root) {
       //终止条件
       if(root==NULL) return 0;
       //单层递归逻辑  后序遍历  左右中
       int leftheight = minDepth(root->left);//左
       int rightheight = minDepth(root->right);//右
       //中
       if(root->left==NULL && root->right!=NULL) return 1 + rightheight;
       if(root->left!=NULL && root->right==NULL) return 1 + leftheight;
       int result = 1 + min(rightheight,leftheight);
       return result;
    }
};

层序遍历

遇到一个节点,该节点的左右孩子都为空,才是最终的叶子节点,return height即可

代码

/**
 * 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 minDepth(TreeNode* root) {
       queue<TreeNode*> que;
       int count = 0;
       if(root!=NULL) que.push(root);
       while(!que.empty()){
           int size =que.size();
           count++;//这时count必须在前面,不能写在后面,要先加
           //如果写在后面,有可能还没有加呢,就直接满足node->left和node->right都为空就直接return了
           while(size--){
               TreeNode* node = que.front();
               que.pop();
               if(node->left){
                   que.push(node->left);
               }
               if(node->right){
                   que.push(node->right);
               }
               if(node->left==NULL && node->right==NULL){
                   return count;
               }   
           }
       }
       return count;  
    }
};

题目4:222 完全二叉树的节点个数

题目链接:222 完全二叉树的节点个数

题意

根据完全二叉树的根节点root,求出该树的节点个数

递归

递归三部曲

1)确定递归函数的参数和返回值

2)确定终止条件

3)确定单层递归的逻辑

后序遍历
普通二叉树

代码

/**
 * 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 countNodes(TreeNode* root) {
        //终止条件
        if(root==NULL) return 0;
        //单层递归逻辑 后序遍历 左右中
        int leftnum = countNodes(root->left);
        int rightnum = countNodes(root->right);
        int result = leftnum + rightnum + 1;
        return result;
    }
};
  • 时间复杂度:O(n)  遍历了所有节点
  • 空间复杂度:O(log n),算上了递归系统栈占用的空间 
完全二叉树

代码

/**
 * 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 countNodes(TreeNode* root) {
        //终止条件  空节点,子树为满二叉树
        if(root==NULL) return 0;//空节点
        TreeNode* leftnode = root->left;
        TreeNode* rightnode = root->right;
        int leftdepth = 0;
        int rightdepth = 0;
        while(leftnode){
            leftnode = leftnode->left;
            leftdepth++;
        }
        while(rightnode){
            rightnode = rightnode->right;
            rightdepth++;
        }
        if(leftdepth==rightdepth) return (2<<leftdepth)-1;//子树是满二叉树
        //单层递归逻辑
        int leftnum = countNodes(root->left);
        int rightnum = countNodes(root->right);
        int result = leftnum + rightnum + 1;
        return result;
    }
};
  • 时间复杂度:O(log n × log n)
  • 空间复杂度:O(log n)

层序遍历

可以求任意一个二叉树的节点个数,并没有用上题目中说的完全二叉树的条件

代码

/**
 * 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 countNodes(TreeNode* root) {
        queue<TreeNode*> que;
        if(root!=NULL) que.push(root);
        int count = 0;
        while(!que.empty()){
            int size = que.size();
            while(size--){
                count++;
                TreeNode* node = que.front();
                que.pop();
                if(node->left) que.push(node->left);
                if(node->right) que.push(node->right);
            }
        }
        return count;
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/318166.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Minio】常见问题解决思路

检查存储服务器对应的端口与应用服务器是否能够互通&#xff0c;通过ping|telnet命令检查、查看防火墙端口是否开放&#xff0c;检查防火墙端口linux系统和windows系统各有不同。检查电脑上的杀毒软件是否限制了网络端口和文件权限问题。检查minio配置信息是否正确&#xff0c;…

Unity AssetBundles资源管理和热更新

项目中的做法&#xff0c;在项目中一般会把资源按照文件目录去划分资源&#xff0c;以文件路径的名字作为AB的名字&#xff0c;一般都是把资源的这些放到预处理中。 一般会分为几个类型&#xff0c;比如把单个文件夹下的每个资源进行打bundle&#xff0c;把单个文件夹下的所有资…

10年果粉拯救老掉牙Mac心得(没错我是标题党)

连续两周了&#xff0c;当我不能用Mac,或者说当我闲置了近10年隔三差五的用Mac时&#xff0c;成功发现我的AppleID已经无法登录了。事情是这样的&#xff0c;当我踌躇满志地准备改一篇稿子&#xff08;潜在的稿费啊亲&#xff01;&#xff09;时&#xff0c;发现Pages竟然没有W…

驾驭数字孪生:智慧水利的未来之路

一、数字孪生技术的原理与实践 随着科技的不断进步&#xff0c;数字孪生技术作为一项创新的技术应用&#xff0c;正在逐渐改变我们的生活和工作方式。特别是在工业领域&#xff0c;数字孪生技术被视为实现智能制造、提升生产效率和产品质量的重要手段。本章节将深入探讨数字孪…

Docker 安装:在linux系统CentOS7 版本 安装Docker

目录 一&#xff0c;Docker介绍&#xff1a; 1.1Docker是什么&#xff1f; 1.2Docker组成 二&#xff0c;Docker安装&#xff1a; 三&#xff0c;Docker基本使用 3.1服务 3.2镜像 3.3容器 &#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&am…

VMware workstation搭建与安装AnolisOS-8.8虚拟机

VMware workstation搭建与安装AnolisOS-8.8虚拟机 适用于需要在VMware workstation平台安装AnolisOS-8.8&#xff08;最小化安装、无图形化界面&#xff09;虚拟机。 1. 安装准备 1.1 安装平台 Windows 11 1.2. 软件信息 软件名称软件版本安装路径VMware-workstation 17 …

前端js调用Lodop实现云打印

一、下载Lodop控件 官网&#xff1a;下载中心 - Lodop和C-Lodop官网主站 二、解压后安装 双击进行安装&#xff0c;里面有些页面文件是一些教程案例 勾选云服务工作模式 安装成功会自动启动 浏览器访问地址&#xff1a;http://localhost:8000/ 首页最下面有个教程案例跳转地址&…

【已解决】C语言实现多线程的同步与异步

说真的写了这篇博文时&#xff0c;才知道c语言本身不支持多线程&#xff0c;而是一些windowsapi让c语言拥有多线程的能力&#xff0c;那下面内容就以打开对话框为例&#xff0c;展现如何实现多线程的同步与异步。 文章目录 问题起源c语言多线程同步方案c语言多线程异步方案总结…

Raspbian安装摄像头

Raspbian安装摄像头 1. 源由2. 摄像头2.1 选型2.2 系统2.3 安装 3. 配置&命令3.1 命令3.2 配置 4. 测试4.1 拍照4.1.1 libcamera-jpeg4.1.2 libcamera-still 4.2 视频流4.2.1 RTSP流4.2.2 TCP流 5. 参考资料 1. 源由 家里闲置两块树莓派&#xff0c;打算做个WiFi视频流RTS…

GC6109——双通道5V低电压步进电机驱动芯片,低噪声、低振动,应用摄像机,机器人等产品中

GC6109是双通道5V低电压步进电机驱动器&#xff0c;具有低噪声、低振动的特点&#xff0c;特别适用于相机的变焦和对焦系统&#xff0c;万向节和其他精密、低噪声的STM控制系统。该芯片为每个通道集成了256微步驱动器。带SPl接口&#xff0c;用户可以方便地调整驱动器的参数。内…

[Windows] Win10 常用快捷键

文章目录 &#x1f680; [Windows] Win10 常用快捷键&#x1f310; Windows 操作系统&#x1f525; Windows 10 &#x1f310; Windows 10 快捷键概览&#x1f525; 基本快捷键&#x1f525; 窗口快捷键&#x1f525; 功能快捷键 &#x1f4dd; 小结 &#x1f680; [Windows] W…

milvus安装及langchain调用

milvus安装及langchain调用 安装milvus安装docker-compose安装milvus安装可视化界面attu 通过langchain调用milvus安装langchain安装pymilvus调用milvus 安装milvus 安装docker-compose 下载文件 curl -L https://github.com/docker/compose/releases/download/1.21.1/docke…

在 WinForms 应用中使用 FtpWebRequest 进行文件操作和数据显示

在 WinForms 应用中使用 FtpWebRequest 进行文件操作和数据显示 引言 在企业级应用或桌面程序中&#xff0c;经常需要从远程服务器获取数据&#xff0c;并在用户界面上展示这些数据。本文将通过一个实际案例&#xff0c;演示如何在 Windows Forms 应用程序中使用 FtpWebReques…

Linux 系统编程:文件系统的底层逻辑 - inode

《Linux 程序设计》的第三章讲文件操作。在提到 目录 时有这么一段文字&#xff1a; 文件&#xff0c;除了本身包含的 内容 以外&#xff0c;它还会有一个 名字 和一些 属性&#xff0c;即“管理信息”&#xff0c;包括文件的创建 / 修改日期和它的访问权限。这些属性被保存在文…

SV-9001 壁挂式网络采播终端

SV-9001 壁挂式网络采播终端 一、描述 SV-9001是深圳锐科达电子有限公司的一款壁挂式网络采播终端&#xff0c;具有10/100M以太网接口&#xff0c;配置一路线路输入和一组麦克风输入&#xff0c;可以直接连接音源输出设备或麦克风&#xff0c;将采集音源编码后发送至网络播放终…

RuoYi-Vue-Plus 5.X登录前流程及解密

一&#xff1a;问题 1. 前端传给后端的是一个加密字符串&#xff0c;后端controller层login接口怎么就直接解密了呢&#xff1f; 2. 中间经过什么步骤到达的登录接口呢&#xff1f; 二&#xff1a;个人分析 首先考虑的是拦截器、过滤器、切面AOP&#xff1b; 1. 使用全文搜…

【重学C语言】二、前期准备和第一个C程序

【重学C语言】二、前期准备和第一个C程序 1. VS 项目1.1 创建项目 2. Clion 项目(本博主主用)2.1 创建项目2.2 Clion 配置 3. 构建类型4. 构建模式5. 注释6. 第一个 C 程序7. 程序闪退8. 新手遇到的问题 1. VS 项目 1.1 创建项目 打开 VS 创建新项目 创建 main.c 书写以下…

轻松查看WiFi密码的神奇脚本,让你忘记密码也不再是问题

说在前面 &#x1f388;本文介绍了一个便捷的脚本&#xff0c;可以帮助你获取电脑中保存的所有Wi-Fi网络的密码。不再需要担心忘记Wi-Fi密码或手动查找密码的麻烦&#xff0c;只需运行脚本即可一键获取。 一、引言 互联网的普及让我们离不开Wi-Fi网络&#xff0c;但忘记密码时…

贝叶斯分类器(公式推导+举例应用)

文章目录 引言贝叶斯决策论先验概率和后验概率极大似然估计朴素贝叶斯分类器朴素贝叶斯分类器的优点与缺点优点缺点 总结实验分析 引言 在机器学习的世界中&#xff0c;有一类强大而受欢迎的算法——贝叶斯分类器&#xff0c;它倚仗着贝叶斯定理和朴素的独立性假设&#xff0c…

fisco-bcos部署pro生产版本

我这里使用的 Ubuntu20.4系统&#xff0c;linux系统把操作命令apt改为yum即可 升级安装包 apt-get update 安装jdk&#xff0c;我这里使用jdk17 apt -y install openjdk-17-jdk-headless 查看java版本 java -version 安装依赖 apt-get install -y curl docker.io docker-com…