二叉树与递归

news2025/1/16 2:34:30

前言

二叉树与递归

文章目录

  • 前言
  • 一、第一种方法
    • 1、如何思考二叉树相关的问题?
      • 1)最大深度的定义
      • 2)由具体到一般
      • 3)公式
      • 4)总结
    • 2、为什么需要使用递归?
      • 1)循环和递归
      • 2)递和归的过程
    • 3、为什么这样写是对的?
    • 4、代码
  • 二、第二种方法
    • 1、思路
    • 2、代码

一、第一种方法


1、如何思考二叉树相关的问题?

LeetCode 104. 二叉树的最大深度 原题链接

1)最大深度的定义

根节点到最远叶子节点最长路径上的节点数。

2)由具体到一般

不要一上来就陷入二叉树的细节,将题目中给的具体的二叉树结构转换成一般的二叉树的结构进行分析,三角形表示子树。
在这里插入图片描述
在这里插入图片描述

3)公式

整棵树的最大深度 = max(左子树的最大深度,右子树的最大深度) + 1。

4)总结

原问题:计算整棵树的最大深度。
子问题:计算左/右子树的最大深度。
计算左子树最大深度和右子树的最大深度与计算整棵树的最大深度是相似的。

2、为什么需要使用递归?

1)循环和递归

类比循环,循环就是在重复执行同样一份代码,计算子问题和原问题也应用一份代码来计算。
注意与循环是有区别的,例如,写一个循环去计算数组的元素和。做法为遍历数组中的每个数将值加到一个循环外的变量,每次循环加的都是同一个循环外的变量。
然而这个问题是有嵌套关系的,需要将计算结果返回给它的上一级问题,而它的上一级问题又会将计算结果返回给上上一级问题,依次类推,所以使用递归实现更合适。

2)递和归的过程

从原问题出发,不断将问题分解成规模更小的子问题,这个过程是递。
不断递下去,总会有个尽头,这个尽头就是递归的边界条件。此问题中边界条件就是空节点,直接返回 0 作为答案,返回的过程就是归。
这样,边界条件和非边界条件都弄清楚了。

3、为什么这样写是对的?

最简单和常见的数学归纳法是证明当n等于任意一个自然数时某命题成立。证明分下面两步:

  1. 证明“当n=1时命题成立。”(选择数字1因其作为自然数集合中中最小值)
  2. 证明“若假设在n=m时命题成立,可推导出在n=m+1时命题成立。(m代表任意自然数)”

这种方法的原理在于:首先证明在某个起点值时命题成立,然后证明从一个值到下一个值的过程有效。当这两点都已经证明,那么任意值都可以通过反复使用这个方法推导出来。把这个方法想成多米诺骨牌效应也许更容易理解一些。2lB]例如:你有一列很长的直立着的多米诺骨牌,如果你可以:

  1. 证明“第一张骨牌会倒。”
  2. 证明“只要任意一张骨牌倒了,其下一张骨牌也会因为前面的骨牌倒而跟著倒。

则可下结论:所有的骨牌都会倒下。

4、代码

class Solution {
public:
    int maxDepth(TreeNode* root) {
        if (root == NULL) return 0;
        int l_depth = maxDepth(root->left);
        int r_depth = maxDepth(root->right);
        return max(l_depth, r_depth) + 1;
    }
};

时间复杂度为 O ( n ) O(n) O(n),尾音每个节点都会遍历了一次。


二、第二种方法


1、思路

在递归的时候除了将节点传下去,还可以将路径上的节点个数传下去,根节点个数为1
在递归的同时可以维护一个全局变量,每次+1之后都更新这个全局变量的最大值。
遍历完整棵树,这个全局变量就是答案。

2、代码

class Solution {
public:
    int ans = 0;
    void dfs(TreeNode* root, int cnt) {
        if (root == NULL) return;
        cnt += 1;
        dfs(root->left, cnt);
        dfs(root->right, cnt);
        ans = max(ans, cnt);
    }
    int maxDepth(TreeNode* root) {
        dfs(root, 0);
        return ans;
    }
};

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

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

相关文章

GitHub上传文件和文件夹以及大于25M的单个文件

有好几个地方直接拖拽上传即可(其中之一见下图),不管是文件还是文件夹目录结构不会变的。一次可上传的文件夹要求其内部的文件个数不超过100个,否则先GitHub上新建文件夹(空文件的嘎货)然后文件分批上传到G…

使用Python谋生的10种方法

这里本文的目录前言在质量保证部(QA)工作成为小型组织的IT员工为应用程序执行专业脚本管理网络教编程技能帮助人们决定位置执行数据挖掘与嵌入式系统互动开展科学任务进行数据实时分析零基础Python学习资源介绍👉Python学习路线汇总&#x1f…

小程序ScrollView置顶只会成功一次,小程序如何做一键置顶?

现在会出现的问题就是点击置顶只会成功触发一次触顶 问题录像 置顶出现的问题为什么会出现这个问题呢? 先看看怎么控制scrollView实现置顶的。 scroll-top number/string 否 设置竖向滚动条位置scroll-view官网地址 通过动态的设置scroll-top来控制滚动条的位置…

Python编码问题整理

GB2312是中国规定的汉字编码,也可以说是简体中文的字符集编码 GBK 是 GB2312的扩展 ,除了兼容GB2312外,它还能显示繁体中文,还有日文的假名 cp936:中文本地系统是Windows中的cmd,默认codepage是CP936,cp936…

three.js之光源

文章目录简介分类环境光点光源平行光聚光灯光源辅助对象相关计算颜色计算阴影相关属性castShadowreceiveShadowshadowLightShadow基类专栏目录请点击 简介 光源是对于自然界光照的模拟,往往为了更好的渲染场景,需要设置不同的光源,设置不同的…

如何利用Python中的scipy做卡方检验?

1.简单介绍 卡方检验是一种用途很广的计数资料的假设检验方法。它属于非参数检验的范畴,主要是比较两个及两个以上样本率(构成比)以及两个分类变量的关联性分析。其根本思想就是在于比较理论频数和实际频数的吻合程度或拟合优度问题。 应用场…

【数据架构】如何通俗易懂的介绍数据模型

一直以来,如何和业务领导讲明白什么是数据模型,是沟通的一大难题,下面演示一个示例,仅供参考。 介绍抽象世界 先从大佬胡本立的《以人为中心的数据观》说起。这个世界可以划分为3个世界,一个是客观存在的客观世界&am…

Lecture3:神经网络与反向传播

目录 1.计算图 2.反向传播与计算图 2.1 第一个例子 2.2 第二个例子--sigmoid 2.3 第三个例子--MAX门 2.4 第四和例子--对于向量的梯度 3.神经网络 4.常见矩阵求导公式 4.1 标量对向量求导 4.2 二次型对向量求导 1.计算图 在实践中我们想要推导和使用解析梯度&…

SOLIDWORKS PDM 2023新功能 SOLIDWORKS本地数据管理优化升级

SOLIDWORKS 2023新版本已经与大家见面,今天众联亿诚与大家分享SOLIDWORKS PDM 2023新功能,让我们先一起来看看视频—— 点击观看SOLIDWORKS PDM 2023新功能 长期以来,SOLIDWORKS PDM Professional一直为SOLIDWORKS的本地数据管理制定标准。随…

centos8 离线安装redis的艰苦历程(gcc、make、redis)

目录 背景环境 一、安装gcc 二、安装make 三、安装redis 背景环境 服务器centos8,内网不能联网 本机Windows,能联网 一、安装gcc 1、下载rpm文件 比较恶心的是需要手动的搜索一个一个的下载。不要问我为什么知道的!!&…

C++11特性-模板的改进

1.模板的右尖括号>> C11模板的多个右尖括号需要一个空格符fun<A<> >,之前连在一起是右移操作符 C11特性优化了这个fun<A<>> 2.模板的默认参数 函数模板能添加模板参数 template <typename T int> 类模板参数多个时&#xff0c;必…

opencv c++ 光流法、稀疏光流法、稠密光流法、均值迁移追踪(meanshift、camshift)

1、概念 参考&#xff1a; (70条消息) 什么是光流法_张年糕慢慢走的博客-CSDN博客_光流法 (70条消息) 计算机视觉--光流法(optical flow)简介_T-Jhon的博客-CSDN博客_光流法 此外&#xff0c;还有基于均值迁移的目标追踪方法&#xff1a; camshift&#xff1a; (75条消息)…

【VC7升级VC8】将vCenter Server 7.X 升级为 vCenter Server 8 (上)—— VC 8系统要求与升级前的说明

目录1. 新 vCenter Server Appliance 8的系统要求1.1 确认升级路径1.2 硬件要求1.3 存储要求1.4 软件要求1.5 vSphere Client 软件要求2. 升级说明2.1 升级阶段介绍2.2 旧VC7虚拟机的信息2.3 打开升级用安装程序&#xff08;1&#xff09;进入vcsa镜像目录&#xff08;2&#x…

leetcode(力扣)算法刷题-160. 相交链表

描述&#xff1a; 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据保证整个链式结构中不存在环。 注意&#xff0c…

Java基础入门第三版黑马课后习题(编程部分)

第 1 章 Java 开发入门 第 2 章 Java 编程基础 1. 编写程序,计算13…99的值,要求如下&#xff1a; (1)使用循环语句实现1~99的遍历 (2)在遍历过程中,通过条件判断当前的数是否为奇数,如果是就累加,否则不加。 public class getSum { 2 public static void main(String[] ar…

vue elementui 多选级联组件 全选功能

Vue 封装 多选级联组件 支持全选功能 使用方式和elm官方一致&#xff0c;原参数一致主要参数&#xff1a; options&#xff1a;级联数菜单。多维数组mulSelectedVal&#xff1a;绑定值。id集合。且取值最后一层idcollapseTags&#xff1a;是否tag展示fieldNames&#xff1a;自…

酵母葡聚糖硫酸酯(SPS)|葡聚糖修饰异黄酮|右旋糖酐修饰Savinase蛋白酶

酵母葡聚糖硫酸酯(SPS)|葡聚糖修饰异黄酮|右旋糖酐修饰Savinase蛋白酶 酵母葡聚糖硫酸酯(SPS) 中文名称&#xff1a;酵母葡聚糖硫酸酯(SPS) 纯度&#xff1a;95% 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 外观:固体或粘性液体 包装&#xff1a;瓶装/袋…

C++ 函数重载的细节

前言&#xff1a;如果不想看论证&#xff0c;可以直接点击总结&#xff0c;跳转到最后 目录 总结 1、使用重载函数时&#xff0c;如果数据类型不匹配&#xff0c;C尝试使用类型转换与形参进行匹配&#xff0c;如果转换后有多个函数能匹配上&#xff0c;编译器将报错&#xff1…

【重识云原生】第六章容器基础6.4.12节——IPv4与IPv6双协议栈配置

1 IPv4/IPv6 双协议栈特性 Kubernetes v1.23 [stable] IPv4/IPv6 双协议栈网络能够将 IPv4 和 IPv6 地址分配给 Pod 和 Service。 从 1.21 版本开始&#xff0c;Kubernetes 集群默认启用 IPv4/IPv6 双协议栈网络&#xff0c; 以支持同时分配 IPv4 和 IPv6 地址。 1.1 支持的…

6 张配图通俗易懂说透 K8S 请求和限制

6 张配图通俗易懂说透 K8S 请求和限制 在 Kubernetes 中使用容器时&#xff0c;了解涉及的资源是什么以及为何需要它们很重要。有些进程比其他进程需要更多的 CPU 或内存。这很关键&#xff0c;永远不应该让进程挨饿。知道了这一点&#xff0c;我们应该正确配置容器和 Pod&…