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

embedded/2024/9/23 14:25:19/

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

二叉树遍历框架如下:

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.ppmy.cn/embedded/18792.html

相关文章

【神经网络基础辨析】什么是神经网络的主干(backbone)、颈部(neck)和头部(head)网络

在神经网络中,通常将网络分为三个部分:骨干网络(Backbone)、颈部网络(Neck)、和头部网络(Head)。 骨干网络(Backbone) 骨干网络通常是神经网络的主要部分&a…

烟雾识别图像处理:原理、应用与未来发展---豌豆云

本文详细介绍了烟雾识别图像处理的基本原理、应用领域以及未来的发展趋势。 通过深入剖析烟雾识别图像处理的关键技术和方法,帮助读者了解该领域的最新进展,为实际应用提供有价值的参考。 随着计算机视觉和人工智能技术的快速发展,烟雾识别…

面试的时间地点(南京坦道)工程化问题比较少,通用性问题表较多

1.前端的选型 2.前端的$nicktick() 3.前端的媒体查询 4.前端的 VUE 高级用法 我的回答{ web端视图层的渲染原理 } 5.前端的数组,异步处理 我的回答{ 回了,最笨的方法。 es6的set(); 参数是&…

TCN-LSTM时间卷积网络长短期记忆网络多输入多输出回归预测

文章目录 效果一览文章概述 订阅专栏只能获取一份代码部分源码参考资料 效果一览 文章概述 TCN-LSTM时间卷积网络长短期记忆网络多输入多输出回归预测 matlab2021 订阅专栏只能获取一份代码 部分源码 %------------------------------------------------------------------…

【设计模式】11、flyweight 享元模式

文章目录 十一、flyweight11.1 pool 连接池11.1.1 pool_test.go11.1.2 pool.go11.1.3 conn.go 11.2 chess_board11.2.1 chess_test.go11.2.2 chess.go 十一、flyweight https://refactoringguru.cn/design-patterns/flyweight 大量重复的对象, 如果很消耗资源, 没必要每次都初…

docker入门级命令

基本概念 docker的连个基本概念:镜像、容器。 docker镜像可以理解为是存储docker安装包的地方,比如:mcr.microsoft.com/mssql/server:2017-latest是sqlserver的docker镜像。 可以通过docker pull命令拉取远程镜像到本地。比如:…

Typescript学习笔记

Typescript学习笔记 标题:TypeScript学习笔记 摘要: 本文详细记录了我在学习TypeScript过程中的学习笔记,包括TypeScript的基础知识、类型系统、高级特性以及实践应用。通过本文,读者可以了解到TypeScript的优势和特点&#xff…

Vitis HLS 学习笔记--Syn Report解读(1)

目录 1. 介绍 2. 示例一 2.1 HLS 代码 2.2 Report 解读 2.2.1 General Information 2.2.2 Timing Estimate 2.2.3 Performance & Resource Estimates 2.2.4 HW interfaces 2.2.4.1 硬件接口报告 2.2.4.2 导出至 Vivado 中的 IP 2.2.4.3 Port-Level Protocols 端…