多叉树的DFS深度优先遍历,回溯法的基础算法之一

news2024/11/26 22:37:39

一、前言

多叉树一般用于解决回溯问题。
想必大家都学过二叉树,以及二叉树的深度优先遍历和广度优先遍历,我们思考:能不能将二叉树的DFS转化为多叉树的DFS?

二、多叉树的结构

多叉树的本质,就是一棵普通的树,比如下图:
如果忽略将来的变化,那么,这棵树可以认为是一个未满的4叉树。不满的4叉树


由于多叉树代码实现比较复杂,在此不介绍。

三、从二叉树看多叉树

二叉树是非常特殊的,每一个节点,它只有2个子节点。并且,这两个节点可以直接拿到,即:
left指向左子节点,right指向右子节点。通过left、right就可以拿到它的左右节点。
多叉树是更加普遍的树结构,它满足树的层序性,满足最多一个父节点的性质。

四、二叉树的DFS,为什么不适用于多叉树?【以中序遍历为例】

我们知道,二叉树遍历满足口诀:“节点,左子树,右子树”。
链接
二叉树中序遍历
如果为二叉树的节点,增加一条子树X,位于右子树的右边。
结构为【左子树,右子树,X子树】
此时,使用中序遍历的口诀,我们发现,子树X遍历不到。【每一层子树X都遍历不到】。

五、解决多叉树遍历问题

多叉树遍历问题的关键在于,由于语句的次序性,每一次只能访问一个节点。
解释:二叉树的递归函数A中,访问节点值的操作,只发生一次,然后将访问左右子节点值的操作,交给子递归函数A’。
即使多出一个子树X,也不会改变语句的次序性。
解决方案:二叉树访问节点Node后,将左右子节点的访问交给子递归函数,那么,也可以把X子树的访问,同样交给子递归函数。
伪代码

void function(Node root){
	// 如果节点为null,返回
	if(node == null) return;
	
	// 访问节点
	print(root.val);
	
	//依次访问左子、右子和X子树
	function(root.left);
	function(root.right);
	function(root.X);
}

做完这一步,相信你对解决其它的多叉树遍历问题也有所了解。
然而,新问题出现了:
function函数,有指向性,直接拿到多叉树的第i个子树,然后遍历。
对于普遍的二叉树,这是没法做到的。

六、解决普遍多叉树,无指向性问题的两种方案

第一,定义节点顺序

既然无指向性,最简单的方案就是提供指向性。
比如对于4叉树,定义为:
第一个子节点fir,
第二个sec,
第三个thi,
第四个four。
这样,访问时就可以依次访问了。
当然,这种解决方案,不适用于外部复杂情况


第二,不考虑顺序,直接遍历子节点集合

如果多叉树提供一种方法,能够返回子节点集合。
那么,我们可以使用List存储子节点集合。
然后用foreach方法,遍历所有子树。
这种方案,使用时不考虑节点间的顺序性。

七、结语

我是蚊子码农,如有补充或者疑问,欢迎在评论区留言。个人的知识体系可能没有那么完善,希望各位多多指正,谢谢大家。

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

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

相关文章

C语言数据存储大小端问题

大小端 什么是大小端 大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中; 小端模式(Little-endian),是指数据的高字…

mcms-5.2.8环境部署

1 数据库 1.1 新建数据库 1.2 导入数据表 2 tomcat配置 2.1 在IDEA中tomcat环境并配置 首先添加tomcat服务器并配置 配置Artifacts(这里配置不正确的话,在运行时会报错:Error during artifact deployment. See server log for details.&am…

日常销售数据分析为什么重要?三个维度全面分析日常销售数据

在当今电子商务的浪潮席卷全球的时代,网店如雨后春笋般涌现,并且竞争日趋激烈。在这样一个充满挑战与机遇的环境中,如何洞察市场动向,把握消费者需求,实现销售业绩的稳步增长,成为每一位电商运营者必须面对…

【1990-2023】上市公司高新技术企业数据(Excel+stata)+do代码

数据简介:根据《上市公司资质认定信息文件》 数据进行整理。筛选“认定项目类型” 为“高新技术企业”;筛选“认定对象身份”为“上市公司本身”,根据“认定时间”和“有效期限”判断当年是否为高新技术企业。有效期限通常为3年,缺…

4.类,方法,对象

1.1.2. 面向对象程序设计的三大特征 1.1.2.1. 封装 面向对象编程核心思想之一就是将数据和对数据的操作封装在一起,形成一般的概念,比如类的概念。 1.1.2.2. 继承 继承体现了一种先进的编程模式。子类可以继承父类的属性和方法。 1.1.2.3. 多态 多…

CMake从安装到精通

目录 引言 1. CMake的安装 2. CMake的原理 3. CMake入门 3.1 CMakeLists.txt与注释 3.2 版本指定与工程描述 3.3 生成可执行程序 3.4 定义变量与指定输出路径 3.5 指定C标准 3.6 搜索文件 3.7 包含头文件 4. CMake进阶 4.1 生成动静态库 4.2 链接动静态库 4.…

【图像分割】DSNet: A Novel Way to Use Atrous Convolutions in Semantic Segmentation

DSNet: A Novel Way to Use Atrous Convolutions in Semantic Segmentation 论文链接:http://arxiv.org/abs/2406.03702 代码链接:https://github.com/takaniwa/DSNet 一、摘要 重新审视了现代卷积神经网络(CNNs)中的atrous卷积…

计算机组成原理(四)Cache存储器

文章目录 Cache存储器的基本原理cache命中率、平均访问时间、效率地址映射全相联映射直接映射组相联映射 查找算法cache 存储器替换策略cache 存储器-写操作策略习题 Cache存储器的基本原理 Cache是一种高速缓冲寄存器,是为了解决CPU和主存之间速度不匹配而采用的一…

检索增强生成(RAG)的挑战与优化措施

如何理解检索增强生成(RAG) 简单来说,RAG就是让LLM通过外部知识源获取额外信息,从而生成更准确、更符合上下文的答案,并减少错误信息(或称为“幻觉”)的产生。 我们都知道,最先进的…

计数排序(Counting Sort)

计数排序(Counting Sort) 计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,快于任何比较排序算法。排序思路: 1.找出待排序数组最大值2.定义一个索引最大…

Python学习打卡:day08

day8 笔记来源于:黑马程序员python教程,8天python从入门到精通,学python看这套就够了 目录 day858、数据容器(序列)的切片序列的常用操作——切片 59、序列的切片课后练习60、集合的定义和操作集合的定义集合的操作添加新元素移除元素从集合…

NATAPP-内网穿透工具----下载与配置

NATAPP-内网穿透工具 基于ngrok的国内高速内网穿透服务,natapp提供了一种便利的方式,使得开发和测试过程更加高效,尤其是在需要进行远程调试或展示时。无论是进行web开发、微信和支付宝的本地开发调试,还是简单地从外部网络访问家…

如何根据使用场景选购3D扫描仪?

三维扫描建模是指通过专业的三维扫描仪对产品进行三维数据的采集,快速获取物体精确的3D数据,实现1:1复刻原物体,扫描后所得的数字化3D模型以obj、fbx、glb、gltf等格式保存。 积木易搭自主研发多款三维扫描设备,拥有多项国家专利&…

初学者必看的web前端开发学习路线,干货满满!

初学者必看的web前端开发学习路线,干货满满! 随着互联网的深入发展,前端工程师这个岗位在市场上的需求,薪资也是很可观的。前端很火,想自学前端的人也很多。包括一些学生、上班族、以前的UI,java,或完全零基础&#xf…

Nginx 高级应用

目录 一.使用alias实现虚拟目录 二. 通过stub_status模块监控nginx的工作状态 三. 使用limit_rate限制客户端传输数据的速度 四. nginx虚拟主机配置 1.基于端口的虚拟主机 2. 基于IP的虚拟主机 3. 基于域名的虚拟主机 nginx配置文件: /…

3阶段提交协议(3pc)

3阶段提交协议(3pc) 1 简介 三阶段提交协议是一个强一致、中心化的原子提交协议。解决了分布式事务、副本容错等分布式问题。其核心思想是将2PC的二阶段提交协议的“准备阶段”一分为二,形成了由CanCommit、PreCommit、DoCommit三个阶段组成…

LWIP移植

目录 前言一、以太网协议简介1.1 TCP/IP协议简介1.2 STM32的ETH外设1.2.1 MAC子层1.2.2 SMI站管理接口1.2.3 MII和RMII接口 1.3 外部PHY芯片LAN87201.3.1 LAN8720 中断管理1.3.2 PHY 地址设置1.3.3 nINT/REFCLKO 配置1.3.4 LAN8720 内部寄存器 1.4 LWIP 简介 二、带操作系统的移…

【热】大数据信用报告查询平台哪个比较好?这个平台值得一试!

在当今数字化时代,大数据技术的发展为个人和企业提供了更便捷、精准的信用报告查询服务。选择一个优秀的大数据信用报告查询平台至关重要,它直接影响到您获取信用信息的准确性和全面性。 首先,选择大数据信用报告查询平台时,您可以…

Flutter图像编辑器应用:创造生动美丽的照片体验

介绍 引言 想象一下,在一个阳光明媚的下午,与家人或朋友漫步在风景如画的街道上。拿出手机,迫不及待地捕捉这一刻的美好,按下快门,留下了一张充满回忆的照片。 然而,回到家后发现照片的亮度有些偏暗&…

大模型应用开发技术:Multi-Agent框架流程、源码及案例实战(二)

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (三) 基于 LlaMA…