从递归角度串联二叉树-图论-动态规划

一、深度理解二叉树的前中后序遍历

二叉树遍历框架如下:

void traverse(TreeNode* root) {if (root == nullptr) {return;}// 前序位置traverse(root->left);// 中序位置traverse(root->right);// 后序位置
}

 先不管所谓前中后序,单看 traverse 函数,你说它在做什么事情?

1.1 链表前后序

其实它就是一个能够遍历二叉树所有节点的一个函数,和你遍历数组或者链表本质上没有区别:

//递归遍历单链表
void traverse(ListNode* head) {if (head == nullptr) {return;}//前序位置traverse(head -> next);//后序位置
}

所谓前序位置,就是刚进入一个节点(元素)的时候,后序位置就是即将离开一个节点(元素)的时候,如下图: 

如果让你倒序打印一条单链表上所有节点的值,你怎么搞?

 实现方式当然有很多,但如果你对递归的理解足够透彻,可以利用后序位置来操作:


// 递归遍历单链表,倒序打印链表元素
void traverse(ListNode *head) {if (head == NULL) {return;}traverse(head->next);// 后序位置print(head->val);
}

 1.2 二叉树前中后序

 我们在递归遍历的二叉树中不同位置进行处理时,实际上就是在下面三个位置进行处理

 反映到整颗树上,如下图:

同时我们要知道,二叉树在进行遍历时,处理流程如下: 

1.2.1 前序

 前序如下图:

由此我们可以看见,如果我们在前序位置进行处理(每个节点左侧),在第一次经过一个节点的时候就可以获取其信息,但无法用来获取子树信息,因此前序一般用来遍历

 1.2.2 后序

 后序如下图: 

 

由此我们可以看见,如果我们在后序位置进行处理(每个节点右侧),那么当我们第一次处理一个节点的时候, 其左右的子节点都被处理过了,也就是我们可以在后序获取子树的所有信息了

 1.2.3 中序

中序主要和回溯有关,我们一般在中序处进行撤回

 二、图论

 图论中最重要的就是遍历,一般都是用到dfs进行回溯(bfs属于层序遍历,这里先不和为一谈)

回溯框架为:

void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {(选择是否处理)处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果}
}

为什么要在前序位置判断是否终止?

因为前序位置时是每一节点第一次到达的位置,在这里判断最省时间 

  

一般以搜索为目的的dfs,都是从上往下思考,从根节点往下搜索,backtracking(路径,选择列表)中做的选择一般都是子节点

三、动态规划 

 为了方便对比,我们以记忆化搜索为主要研究对象

动态规划就是把大问题抽象为多个小问题,然后用选择连接多个小问题,如下图:

我们以下面一段动态规划代码进行解释: 

由于我们的决策要在遍历完所有选择之后再做,因此我们在后序位置进行状态更新

在动态规划中,我们一般都是从下往上思考(上面这题除外,有些题也可以从上往下,只是说我们从下往上状态转移方程更好思考),每个dfs中做的选择一般都是上一层的节点

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

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

相关文章

常见的工业路由器访问问题

A:工业路由器已经设置了pptp怎么访问路由下面的电脑 1. 确认PPTP VPN设置:首先,确保PPTP VPN服务器在工业路由器上已正确设置,并且处于活动状态。这包括确保VPN服务器的IP地址、端口、用户名和密码等设置正确无误。 2. 连接到VP…

硬件24、嘉立创EDA丝印的优化和调整

1、调整全部丝印的属性 先选中一个丝印,然后右键点击它,选择查找,然后选择查找全部 选择查找全部这个时候可以设置所有丝印在元件的位置了,布局-》属性位置,位号,属性位置设置为上边,这时丝印就…

五、yolov8 tensorRT c++部署及接口封装(保姆级教程附源码)

采用 CTensorRT来部署深度学习模型有以下几个优点: 高性能推理:TensorRT是一个高性能的深度学习推理(Inference)优化器,专门为NVIDIA GPU硬件平台设计,能够提供低延迟、高吞吐量的模型推理性能。这意味着在…

深度学习pytorch实战4---猴逗病识别·

>- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **🍖 原作者:[K同学啊](https://mtyjkh.blog.csdn.net/)** 引言 1.复习上周并反思 K同学针对大家近…

python爬虫 - 爬取html中的script数据(36kr.com新闻信息)

文章目录 1. 分析页面内容数据格式2. 使用re.findall方法,爬取新闻3. 使用re.search 方法,爬取新闻 1. 分析页面内容数据格式 打开 https://36kr.com/ 按F12(或 在网页上右键 --> 检查(Inspect)) 找…

c++初阶——类和对象(中)

大家好,我是小锋,我们今天继续来学习类和对象。 类的6个默认成员函数 我们想一想如果一个类什么都没有那它就是一个空类,但是空类真的什么都没有吗? 其实并不是,任何类在什么都不写时,编译器会自动生成以…

电脑提示丢失iutils.dll怎么办?一分钟教你搞定dll丢失问题

在计算机世界中,DLL(Dynamic Link Library,动态链接库)文件扮演着至关重要的角色,它们如同乐高积木中的基础模块,不同程序通过调用这些模块来实现各种功能。其中,iutils.dll就是这样一款不可或缺…

transformer 最简单学习3, 训练文本数据输入的形式

1、输入数据中,源数据和目标数据的定义 def get_batch(source,i):用于获取每个批数据合理大小的源数据和目标数据参数source 是通过batchfy 得到的划分batch个 ,的所有数据,并且转置列表示i第几个batchbptt 15 #超参数,一次输入多少个ba…

聚类分析字符串数组

聚类分析字符串数组 对多个字符串进行聚类分析旨在根据它们之间的相似度将这些字符串划分成若干个类别,使得同一类别内的字符串彼此相似度高,而不同类别间的字符串相似度低 小结 数据要清洗。清洗的足够准确,可能不需要用聚类分析了数据要…

统一所有 LLM API:支持预算与速率限制 | 开源日报 No.229

BerriAI/litellm Stars: 6.7k License: NOASSERTION litellm 是一个使用 OpenAI 格式调用所有 LLM API 的工具。它支持 Bedrock、Azure、OpenAI、Cohere、Anthropic 等 100 多种 LLMs,提供企业级代理服务器和稳定版本 v1.30.2。 主要功能和优势包括: 将…

javaEE初阶——多线程(八)——常见的锁策略 以及 CAS机制

T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 小比特 大梦想 此篇文章与大家分享分治算法关于多线程进阶的章节——关于常见的锁策略以及CAS机制 如果有不足的或者错误的请您指出! 目录 多线程进阶1.常见的锁策略1.1乐观锁和悲观锁1.2重量级锁 和 轻量级锁1.…

【大数据】分布式数据库HBase

目录 1.概述 1.1.前言 1.2.数据模型 1.3.列式存储的优势 2.实现原理 2.1.region 2.2.LSM树 2.3.完整读写过程 2.4.master的作用 1.概述 1.1.前言 本文式作者大数据系列专栏中的一篇文章,按照专栏来阅读,循序渐进能更好的理解,专栏…

JS实现对用户名、密码进行正则表达式判断,按钮绑定多个事件,网页跳转

目标&#xff1a;使用JS实现对用户名和密码进行正则表达式判断&#xff0c;用户名和密码正确时&#xff0c;进行网页跳转。 用户名、密码的正则表达式检验 HTML代码&#xff1a; <button type"submit" id"login-btn" /*onclick"login();alidate…

精益思想赋能数字化转型:落地策略与实践路径

当下&#xff0c;数字化转型已不再是选择题&#xff0c;而是关乎企业生存与发展的必答题。然而&#xff0c;转型过程中如何确保效率、降低成本并快速实现价值创造&#xff0c;成为了摆在众多企业面前的难题。精益思想作为一种追求精益求精、持续改进的管理思维&#xff0c;为数…

2024最新版JavaScript逆向爬虫教程-------基础篇之面向对象

目录 一、概念二、对象的创建和操作2.1 JavaScript创建对象的方式2.2 对象属性操作的控制2.3 理解JavaScript创建对象2.3.1 工厂模式2.3.2 构造函数2.3.3 原型构造函数 三、继承3.1 通过原型链实现继承3.2 借用构造函数实现继承3.3 寄生组合式继承3.3.1 对象的原型式继承3.3.2 …

stm32HAL库-GPIO

一 什么是 GPIO: GPIO(general porpose intput output), 通用输入输出端口 . 二 我们先认识芯片控制 GPIO 输出控制。 2.1LED 硬件原理如图&#xff1a; 当电流从这根电线流通&#xff0c; LED 亮。当电流不通过这根电线&#xff0c; LED 灭。 上面 PF** &#xff0c;芯片电…

MySQL面试——聚簇/非聚簇索引

存储引擎是针对表结构&#xff0c;不是数据库 引擎层&#xff1a;对数据层以何种方式进行组织 update&#xff1a;加索引&#xff1a;行级锁&#xff1b;不加索引&#xff1a;表级锁

固态继电器:推进可再生能源系统

随着可再生能源系统的发展&#xff0c;太阳能系统日益成为现代能源解决方案的先锋。在这种背景下&#xff0c;固态继电器&#xff08;SSR&#xff09;&#xff0c;特别是光耦固态继电器的利用变得日益突出。本文旨在深入探讨SSR在可再生能源系统中的多方位应用&#xff0c;重点…

【学习笔记】Python 使用 matplotlib 画图

文章目录 安装中文显示折线图、点线图柱状图、堆积柱状图坐标轴断点参考资料 本文将介绍如何使用 Python 的 matplotlib 库画图&#xff0c;记录一些常用的画图 demo 代码 安装 # 建议先切换到虚拟环境中 pip install matplotlib中文显示 新版的 matplotlib 已经支持字体回退…

SD-WAN:灵活、低成本、便于管理

近年来&#xff0c;SD-WAN&#xff08;软件定义广域网&#xff09;技术成为企业网络领域的新趋势&#xff0c;其带来的变革性影响备受瞩目。凭借出色的灵活性、高效的可管理性以及显著的成本优势&#xff0c;SD-WAN技术为企业网络注入了新的活力。 首先&#xff0c;SD-WAN技术的…