笔记84:关于递归法的一些感悟

题目1:二叉树的前序遍历

链接:. - 力扣(LeetCode)

/*** 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:void DFS_pre(TreeNode* ptr, vector<int>& result) {if(ptr == nullptr) return;result.push_back(ptr->val);DFS_pre(ptr->left, result);DFS_pre(ptr->right, result);}vector<int> preorderTraversal(TreeNode* root) {//个人尝试:递归求解//前序:中左右vector<int> result;DFS_pre(root, result);return result;}
};

补充说明:对于二叉树的前中后续遍历,传入的指针参数只有一个


题目2:对称二叉树

链接:. - 力扣(LeetCode)

/*** 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:bool Compare_Left_And_Right(TreeNode* left, TreeNode* right) {//终止条件if(left == nullptr && right == nullptr) return true;if(left != nullptr && right == nullptr) return false;if(left == nullptr && right != nullptr) return false;if(left->val != right->val) return false;                           //比较中侧(这四个终止条件,都是对中侧的比较)bool outside = Compare_Left_And_Right(left->left, right->right);    //比较外侧bool inside = Compare_Left_And_Right(left->right, right->left);     //比较内侧return (outside && inside);}bool isSymmetric(TreeNode* root) {//自己尝试:递归法if(root == nullptr) return true;return Compare_Left_And_Right(root->left, root->right);}
};

补充:对于这个题,递归函数体内部传入了两个指针参数


感悟:在做这个题之前,我一直以为递归算法只能指定一个遍历方向,但其实递归非常的强大,可以指定多个方向同时遍历;

(1)如果递归函数体只能传入一个指针参数,那么递归只能往同一个方向遍历;例如对二叉树前中后序的遍历,都是只有一个参数的递归,因此递归函数体的内部主逻辑中,只有对这一个参数的处理,而在递归函数体内部再一次调用递归函数体时,也是只能传入一个参数,那么这就导致我们只能往一个方向遍历;比如上个递归体中参数是左分支,那么当前这个递归体传入的参数必须是左分支的左分支,即都是往左进行的遍历;(否则一会往左递归,一会往右递归,就乱套了,没有了共同规则的约束)

(2)如果递归函数体可以传入两个指针参数,那么递归就可以往两个方向同时进行;例如对称二叉树这个题,我们想左子树往左遍历,右子树往右遍历,那么递归的参数必须有俩,一个遵循往左走, 一个遵循往右走,即两个参数往两个不同的方向走;

图解:

前序遍历(统一往左侧遍历)
对称二叉树(双向遍历)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

18.软件定时器

一、简介 软件定时器是指具有定时功能的软件&#xff0c;FreeRTOS 提供的软件定时器允许在创建前设置一个 软件定时器定时超时时间&#xff0c;在软件定时器成功创建并启动后&#xff0c;软件定时器开始定时&#xff0c;当软件定 时器的定时时间达到或超过先前设置好的软件定时…

异地组网怎么安装?

异地组网安装是指在不同地域的多个设备之间建立网络连接&#xff0c;以便实现数据传输和协同工作的过程。在如今的数字化时代&#xff0c;异地组网安装已经成为了许多企业和组织所必需的一项技术。 天联的使用场景 在异地组网安装中&#xff0c;天联是一种常用的工具。它具有以…

锁策略总结

锁策略 悲观锁和乐观锁 乐观锁和悲观锁不是具体类型的锁而是指两种不同的对待加锁的态度&#xff0c;这两个锁面对锁冲突的态度是相反的。 乐观锁&#xff1a;认为不存在很多的并发操作&#xff0c;因此不需要加锁。悲观锁&#xff1a;认为存在很多并发操作&#xff0c;因此需…

ffmpeg命令与批处理编程

(一) CMD脚本查找所有文件 powershell与cmd转换 powershell与cmd虽然同为windows命令&#xff0c;但许多命令并不通用。 CMD换行符 a 在CMD下&#xff0c;可以用^作为换行符&#xff0c;类似于Linux下的\。举例如下&#xff1a; start pemu.exe ^ -net nic,vlan1,macaddr…

OpenKylin设置root密码

前言 新安装的OpenKylin系统应该root用户没有设置密码&#xff0c;但是可以使用sudo -i 临时获取root权限&#xff0c;不影响正常使用 当前是root用户 1、终端输入passwd命令 passwd2、按照提示输入新密码和确认密码 当前非root用户 1、终端输入sudo passwd root 命令 s…

设计模式面试题

概述 设计模式分类 创建型模式 用于描述“怎样创建对象”&#xff0c;主要特点是“将对象的创建与使用分离”。使用者不需要官族对象创建的细节。结构型模式 用于描述如何将类或对象按照某种布局组成更大的结构。行为型模式 用于描述类或对象之间怎样相互协作共同完成单个对象…

没有学历,没有基础,是否能成为一个嵌入式工程师?

没有学历&#xff0c;且毫无基础&#xff0c;是否真的能够成为一名嵌入式工程师呢&#xff1f;想要成为一名真正足以胜任上下游工作的工程师&#xff0c;至少是需要耗费五年时间的。在这一过程当中&#xff0c;你将会遭遇各式各样的挑战&#xff0c;需要去掌控操作系统、数据结…

实时数据同步之Maxwell和Canal

文章目录 一、概述1、实时同步工具概述1.1 Maxwell 概述1.2 Canal概述 2、数据同步工作原理2.1 MySQL 主从复制过程2.2 两种工具工作原理 3、MySQL 的 binlog详解3.1 什么是 binlog3.2 binlog 的开启3.3 binlog 的分类设置 4、Maxwell和Canal对比5、环境安装 二、Maxwell 使用1…

护眼台灯哪个牌子好?精选五款备受好评性价比高的护眼灯

众所周知&#xff0c;用眼习惯是影响视力的一大因素&#xff0c;但往往忽略了光线对视力的关键作用。孩子在白天长时间用眼&#xff0c;若晚上又在昏暗环境下读书、写作或使用电子产品&#xff0c;这种双重负担会加剧眼睛疲劳&#xff0c;进而可能导致视力逐渐受损。随着熬夜学…

部署ELFK+zookeeper+kafka架构

目录 前言 一、环境部署 二、部署ELFK 1、ELFK ElasticSearch 集群部署 1.1 配置本地hosts文件 1.2 安装 elasticsearch-rpm 包并加载系统服务 1.3 修改 elasticsearch 主配置文件 1.4 创建数据存放路径并授权 1.5 启动elasticsearch是否成功开启 1.6 查看节点信息 …

Springboot+Vue项目-基于Java+Mysql的网上订餐系统(附源码+LW+演示录像)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

太好玩了,我用 Python 做了一个 ChatGPT 机器人

毫无疑问&#xff0c;ChatGPT 已经是当下编程圈最火的话题之一&#xff0c;它不仅能够回答各类问题&#xff0c;甚至还能执行代码&#xff01; 或者是变成一只猫 因为它实在是太好玩&#xff0c;我使用Python将ChatGPT改造&#xff0c;可以实现在命令行或者Python代码中调用。…