代码随想录算法训练营第十六天 | 104.二叉树的最大深度 559.n叉树的最大深度,111.二叉树的最小深度,222.完全二叉树的节点个数

news2024/11/19 14:23:17

代码随想录算法训练营第十六天 | 104.二叉树的最大深度 559.n叉树的最大深度,111.二叉树的最小深度,222.完全二叉树的节点个数

1.1 104.二叉树的最大深度

思路:

  1. 采用后序遍历
  2. 确定递归函数的参数和返回值,确定终止条件,确定单层递归的逻辑
class solution {
public:
    int getdepth(TreeNode* node) {
        if (node == NULL) return 0;
        int leftdepth = getdepth(node->left);       // 左
        int rightdepth = getdepth(node->right);     // 右
        int depth = 1 + max(leftdepth, rightdepth); // 中
        return depth;
    }
    int maxDepth(TreeNode* root) {
        return getdepth(root);
    }
};

思路:

  1. 采用前序遍历
  2. 深度回溯的过程
class solution {
public:
    int result;
    void getdepth(TreeNode* node, int depth) {
        result = depth > result ? depth : result; // 中

        if (node->left == NULL && node->right == NULL) return ;

        if (node->left) { // 左
            depth++;    // 深度+1
            getdepth(node->left, depth);
            depth--;    // 回溯,深度-1
        }
        if (node->right) { // 右
            depth++;    // 深度+1
            getdepth(node->right, depth);
            depth--;    // 回溯,深度-1
        }
        return ;
    }
    int maxDepth(TreeNode* root) {
        result = 0;
        if (root == NULL) return result;
        getdepth(root, 1);
        return result;
    }
};

1.2 559.n叉树的最大深度

思路:

  1. 递归法
  2. 注意函数返回的是以该节点起接着往下的深度
class Solution {
private:
    int getdepth(Node* node){
        if(node == nullptr) return 0;
        int size = node->children.size();
        int depth = 0;
        for(int i = 0; i < size; ++i){
            depth = max(depth, getdepth(node->children[i]));
        }
        return depth + 1;
    }
public:
    int maxDepth(Node* root) {
        return getdepth(root);
    }
};

思路:

  1. 迭代法(层序遍历)
class solution {
public:
    int maxDepth(Node* root) {
        queue<Node*> que;
        if (root != NULL) que.push(root);
        int depth = 0;
        while (!que.empty()) {
            int size = que.size();
            depth++; // 记录深度
            for (int i = 0; i < size; i++) {
                Node* node = que.front();
                que.pop();
                for (int j = 0; j < node->children.size(); j++) {
                    if (node->children[j]) que.push(node->children[j]);
                }
            }
        }
        return depth;
    }
};

1.3 111.二叉树的最小深度

思路:

  1. 递归法
  2. 注意如何处理只有一边有孩子的情况,只有左右孩子都为空的节点才是叶子节点
class Solution {
public:
    int getDepth(TreeNode* node) {
        if (node == NULL) return 0;
        int leftDepth = getDepth(node->left);           // 左
        int rightDepth = getDepth(node->right);         // 右
                                                        // 中
        // 当一个左子树为空,右不为空,这时并不是最低点
        if (node->left == NULL && node->right != NULL) { 
            return 1 + rightDepth;
        }   
        // 当一个右子树为空,左不为空,这时并不是最低点
        if (node->left != NULL && node->right == NULL) { 
            return 1 + leftDepth;
        }
        int result = 1 + min(leftDepth, rightDepth);
        return result;
    }

    int minDepth(TreeNode* root) {
        return getDepth(root);
    }
};

1.4 222.完全二叉树的节点个数

思路:

  1. 递归
  2. 后序遍历
class Solution {
private:
    int getNum(TreeNode* node){
        if(node == nullptr) return 0;
        int leftSum = getNum(node->left);
        int rightSum = getNum(node->right);
        return leftSum + rightSum + 1;
    }
public:
    int countNodes(TreeNode* root) {
        return getNum(root);
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(log n),算上了递归系统栈占用的空间

思路:

  1. 考虑完全二叉树的特性
class Solution {
public:
    int countNodes(TreeNode* root) {
        if (root == nullptr) return 0;
        TreeNode* left = root->left;
        TreeNode* right = root->right;
        int leftDepth = 0, rightDepth = 0; // 这里初始为0是有目的的,为了下面求指数方便
        while (left) {  // 求左子树深度
            left = left->left;
            leftDepth++;
        }
        while (right) { // 求右子树深度
            right = right->right;
            rightDepth++;
        }
        if (leftDepth == rightDepth) {
            return (2 << leftDepth) - 1; // 注意(2<<1) 相当于2^2,所以leftDepth初始为0
        }
        return countNodes(root->left) + countNodes(root->right) + 1;
    }
};
  • 时间复杂度:O(log n × log n)
  • 空间复杂度:O(log n)

1.5 补充

递归的复杂度:

image-20230525205701712

迭代的复杂度:

image-20230525205713576

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AJAX 教程---菜鸟教程

文章目录 AJAX 简介AJAX 实例XHR 创建对象XHR 请求向服务器发送请求GET 还是 POST&#xff1f;GET 请求POST 请求url - 服务器上的文件 XHR 响应responseText 属性responseXML 属性 XHR readyState使用回调函数 AJAX 简介 AJAX 是一种在无需重新加载整个网页的情况下&#xff0…

CTR预估之DNN系列模型:FNN/PNN/DeepCrossing

前言 在上一篇文章中 CTR预估之FMs系列模型:FM/FFM/FwFM/FEFM&#xff0c;介绍了FMs系列模型的发展过程&#xff0c;开启了CTR预估系列篇章的学习。FMs模型是由线性项和二阶交互特征组成&#xff0c;虽然有自动学习二阶特征组合的能力&#xff0c;一定程度上避免了人工组合特征…

【Springboot】集成百度地图实现定位打卡功能

目录 第一章 需求分析 第二章 概要设计 第三章 详细设计 3.1 环境搭建 3.1.1 获取百度地图ak 3.1.2 创建springboot项目 3.2 配置application.properties 3.3 配置pox.xml 3.4 创建定位接口 3.5 创建前端页面 3.6 映射静态文件 第一章 需求分析 如图&#xff0c;当…

BERT论文核心点记录

BERT适合分类任务&#xff08;整段分类后者词分类&#xff09;&#xff0c;对生成任务不友好 使用BERT的方法&#xff1a;只需要在预训练好的BERT基础上新增一个输出层&#xff0c;然后用标记好的数据进行有监督微调 Bidirectional Encoder双向Encoder实质上就是指Transforme…

【分享】用java和pathon实现小红书(Red Booklet)客服自动回复功能、技术实现分析

技术栈&#xff1a;python、java、android&#xff0c;进程管理、socket通信 客户需求&#xff1a; 客户需要在Red Booklet平台做一个可以24小时自动回复用户私信、评论、回关用户等行为的客服软件。他说他们公司有50个小红书号&#xff0c;十几个客服&#xff0c;急需一款代…

正则表达式和文本三剑客题型练习

​ 1、显示/etc/passwd文件中以bash结尾的行&#xff1b; 解释&#xff1a;使用 grep 工具来搜索文件 /etc/passwd 中匹配模式 bash$ 的行。bash$ 是一个正则表达式&#xff0c;其中 $ 表示行结尾。因此&#xff0c;bash$ 匹配以 bash 结尾的行。 grep bash$ /etc/passwd 运…

四元数转换为欧拉角(多解问题)

车辆行驶状态估计&#xff08;4&#xff09;中车辆横摆角信息在顺时针转向时存在明显的错误&#xff0c;进行记录输出 2023-05-25-aft02.txt 四元数&#xff1a; -0.00201210.00115721 -0.0005967610.999997 欧拉角&#xff1a;3.14039四元数&#xff1a; -0.00170584 -0.00…

RabbitMQ(2)、MQ的问题、消息可靠性

一、MQ的问题 基于上篇存在的问题 1. 问题说明 MQ在分布式项目中是非常重要的&#xff0c; 它可以实现异步、削峰、解耦&#xff0c;但是在项目中引入MQ也会带来一系列的问题。 今天我们要解决以下几个常见的问题&#xff1a; 消息可靠性问题&#xff1a;如何确保消息被成功送…

MySQL — SQL 优化

文章目录 SQL 优化一、插入数据二、主键优化2.1 数据组织方式2.2 页分裂2.3 页合并2.4 主键设计原则 三、 Order by 优化3.0 排序方式讲解3.1 升序/降序联合索引结构图示3.2 总结 四、Group by优化五、limit优化六、 count优化七、update优化七、update优化 SQL 优化 一、插入…

【MySQL 数据库】5、存储引擎

目录 一、MySQL 体系结构二、存储引擎简介三、InnoDB 存储引擎四、MyISAM五、Memory六、三大存储引擎比较七、存储引擎的选择 一、MySQL 体系结构 连接层 最上层是一些客户端和链接服务&#xff0c;包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。主…

07:MYSQL----多表查询

目录 1:多表查询概述 2:多表查询分类 3:内连接 3:外连接 4:自连接 5:联合查询-union&#xff0c;union all 6:子查询 1:多表查询概述 select * from emp , dept; emp:表中有6条数据, dept表中有5条数据只查询出来的数据为:30条 概述:指从多张表中查询数据 笛卡尔积…

在vite或者vue-cli中使用.env[mode]环境变量

在项目中总会遇到一些默认的配置,需要我们配置到静态文件中方便我们去获取,这时候就可以用到这个.env环境变量文件,在cli创建的项目中顶层的nodejs会有一个process对象,这个对象可以根据不同的环境获取不同的环境配置文件,但是vite中获取变量的方式不一样。 创建变量文件.env.…

如何编写接口自动化框架系列之requests详解(三)

目录 1.http协议 2.requests介绍 3.requests的主要功能 3.requests的主要功能 3.1 场景1-常用方法 3.2 场景2-通用方法 3.3 场景3-cookies认证方式 4.requests 在项目中的实践 4.1 在接口层实现一个接口 4.2 在测试用例层调用 4.3 项目总结 本文是接口自动化测试框架…

IOC初始化 IOC启动阶段 (Spring容器的启动流程)

[toc](IOC初始化 IOC启动阶段 (Spring容器的启动流程)) IOC初始化 IOC启动阶段 (Spring容器的启动流程) Resource定位过程&#xff1a;这个过程是指定位BeanDefinition的资源&#xff0c;也就是配置文件&#xff08;如xml&#xff09;的位置&#xff0c;并将其封装成Resource对…

Makefile基础教程(make的隐式规则)

文章目录 前言一、什么是make的隐式规则二、makefile中出现同名目标时三、一些常见的隐式规则四、查看隐式规则五、隐式规则缺点六、禁用隐式规则1.全局禁用2.局部禁用 总结 前言 本篇文章将给大家介绍make的隐式规则。 一、什么是make的隐式规则 Make 的隐式规则是指 Make …

css选择器及其权重

1. 类型选择器 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wid…

【ZYNQ】裸机 PS + PL 双网口实现之 ZYNQ 配置

目前&#xff0c;在 ZYNQ 中进行以太网开发的方案&#xff0c;大部分都是基于通过 PS 的 MIO 以 RGMII 接口连接外部 PHY 芯片的方式。但是&#xff0c;由于使用 PS 的 MIO 只能以 RGMII 接口连接外部 PHY 芯片&#xff0c;这就限制了支持其他接口 PHY 芯片的使用&#xff0c;如…

分文件实现温湿度数据管理系统项目

目标&#xff1a; 了解分文件的概念&#xff0c;要依次从C语言的函数声明、变量的存储类别、C语言编译预处理&#xff0c;说起。这些知识点我们之前或多或少接触过&#xff0c;这里做个总结与拓展。经过总结&#xff0c;最后我们归纳出一个实现C语言模块化编程的技巧&#xff…

03-bootstrap-响应式布局-栅格系统

一、概述 1、栅格系统是 Bootstrap 中响应式布局的重要组成部分&#xff0c;旨在实现页面元素的自适应排版。Bootstrap 栅格系统将屏幕宽度分为 12 列&#xff0c;通过在 HTML 元素上添加相应的类名&#xff0c;可以让元素占据指定数量的列数&#xff0c;从而实现灵活的布局效…

5种易实现的Linux和 Windows VPS速度提升方法

​  无论是Linux VPS还是Windows VPS&#xff0c;网站速度的提高都是非常重要的。它们在提高网站速度方面都有很多的优化方法。下面我们将介绍 5 种提高网站速度的方法。 1.通过缓存加速 缓存通常是用来加快商业网站加载时间的技术&#xff0c;因此它也可以用在 VPS 上。没有…