【算法】深度优先遍历(DFS)算法详解与实现

文章目录

  • 1.算法原理
  • 2. 常见的深度优先遍历方式
  • 3. 代码实现
  • 总结

深度优先遍历(DFS)是一种常用的树或图的遍历算法,它通过尽可能深地搜索树或图的分支,直到路径上的所有节点都被访问完毕,然后再回溯到上一层,继续搜索其他路径。在二叉树中,常见的深度优先遍历包括前序遍历、中序遍历和后序遍历。

1.算法原理

深度优先遍历算法的核心思想是通过递归或栈来实现,它遵循以下步骤:

  1. 从根节点(或其他指定的起始节点)开始遍历。
  2. 访问当前节点,并标记为已访问。
  3. 递归地遍历当前节点的邻居节点,如果邻居节点未被访问,则重复步骤2。
  4. 当所有邻居节点都被访问完毕或当前节点没有未访问的邻居节点时,回溯到上一层节点,继续遍历其他分支。

2. 常见的深度优先遍历方式

在二叉树中,常见的深度优先遍历方式有三种:

  • 前序遍历(Preorder Traversal):先访问根节点,然后递归地遍历左子树和右子树。
  • 中序遍历(Inorder Traversal):先递归地遍历左子树,然后访问根节点,最后递归地遍历右子树。
  • 后序遍历(Postorder Traversal):先递归地遍历左子树和右子树,然后访问根节点。

3. 代码实现

#include <iostream>
#include <stack>
using namespace std;// 定义二叉树节点结构体
struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};// 前序遍历(递归版本)
void preorderTraversal(TreeNode* root) {if (root) {cout << root->val << " ";preorderTraversal(root->left);preorderTraversal(root->right);}
}// 中序遍历(递归版本)
void inorderTraversal(TreeNode* root) {if (root) {inorderTraversal(root->left);cout << root->val << " ";inorderTraversal(root->right);}
}// 后序遍历(递归版本)
void postorderTraversal(TreeNode* root) {if (root) {postorderTraversal(root->left);postorderTraversal(root->right);cout << root->val << " ";}
}int main() {// 构建示例二叉树//       1//      / \//     2   3//    / \//   4   5TreeNode* root = new TreeNode(1);root->left = new TreeNode(2);root->right = new TreeNode(3);root->left->left = new TreeNode(4);root->left->right = new TreeNode(5);cout << "前序遍历:";preorderTraversal(root);cout << endl;cout << "中序遍历:";inorderTraversal(root);cout << endl;cout << "后序遍历:";postorderTraversal(root);cout << endl;// 释放内存delete root->left->left;delete root->left->right;delete root->left;delete root->right;delete root;return 0;
}

应用:
在这里插入图片描述

class Solution {
public:bool evaluateTree(TreeNode* root) {// 判断是否为叶子节点if (root->left == nullptr) return root->val == 0 ? false : true;//dfsbool left = evaluateTree(root->left);bool right = evaluateTree(root->right);return root->val == 2 ? left | right : left & right; }
};

总结

深度优先遍历是一种重要的遍历算法,对于理解树和图的结构及其应用具有重要意义。通过掌握深度优先遍历的原理和常见实现方式,能够更加深入地理解算法的本质,并能够应用于解决各种相关问题。

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

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

相关文章

什么是云渲染?云渲染平台怎么使用?云渲染怎么收费?

什么是云渲染&#xff1f; 云渲染是一种利用云计算技术提供的云端服务&#xff0c;用户可以将本地任务递交到远程服务器上&#xff0c;由远程计算集群协调和完成渲染&#xff0c;并将结果返回本地&#xff0c;最后用户可以在本地下载渲染结果。 而实时云渲染则是云渲染的一种…

P1010 [NOIP1998 普及组] 幂次方

本文由Jzwalliser原创&#xff0c;发布在CSDN平台上&#xff0c;遵循CC 4.0 BY-SA协议。 因此&#xff0c;若需转载/引用本文&#xff0c;请注明作者并附原文链接&#xff0c;且禁止删除/修改本段文字。 违者必究&#xff0c;谢谢配合。 个人主页&#xff1a;blog.csdn.net/jzw…

python入门之简洁安装VS保姆版安装(含虚拟环境)

11、保姆版安装 Anoconda安装&#xff08;python的一个发行版本&#xff09; 优点&#xff1a;集成了许多关于python科学计算的第三方库&#xff0c;保姆级别 下载&#xff1a;www.anaconda.com/download/ 版本默认64位&#xff0c;py37 √&#xff1a;add anaconda to my…

OCP Java17 SE Developers 复习题14

答案 C. Since the question asks about putting data into a structured object, the best class would be one that deserializes the data. Therefore, ObjectInputStream is the best choice, which is option C. ObjectWriter, BufferedStream, and ObjectReader are no…

可视化看板有那么多应用场景,该如何快速搭建?可视化工具该如何选择?

在当今的信息化时代&#xff0c;数据已经成为了现代决策的核心。无论是企业战略规划、运营管理&#xff0c;还是个人生活决策&#xff0c;数据都扮演着至关重要的角色。随着数据分析技术和工具的不断进步&#xff0c;数据在决策中的作用将变得更加突出&#xff0c;对组织和个人…

【Qt】Qt中代替C语言scanf和gets函数的方法

1、图形界面 Qt可以使用图像界面控件获取输入(这不废话吗?) 1)QLineEdit获取单行输入 QLineEdit *lineEdit = new QLineEdit(); // 单行输入框 QString strTextInput = lineEdit->text(); // 获取输入内容2)QTextEdit 获取多行输入框 QTextEdit *textEdit =

代码随想录算法训练营第三十六天|435. 无重叠区间,763.划分字母区间,56. 合并区间

题目&#xff1a;435. 无重叠区间 给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi]。返回需要移除区间的最小数量&#xff0c;使剩余区间互不重叠。 题目链接/讲解链接&#xff1a; https://programmercarl.com/0435.%E6%97%A0%E9%87%8D%E5%8F%A0…

功能强大的开源数据中台系统 DataCap 2024.03.3 发布

推荐一套基于 SpringBoot 开发的简单、易用的开源权限管理平台&#xff0c;建议下载使用: https://github.com/devlive-community/authx 推荐一套为 Java 开发人员提供方便易用的 SDK 来与目前提供服务的的 Open AI 进行交互组件&#xff1a;https://github.com/devlive-commun…

密文字段模糊检索方案

代码地址: https://github.com/zuiyu-main/EncryptDemo https://mp.weixin.qq.com/s/cXOg1tiMtJz2eibDZmXHUQ 在个别特殊领域中&#xff0c;数据的安全问题是非常的重要的&#xff0c;所以需要数据库存储的数据是需要加密存储的。所以也就引申出来本文这个问题&#xff0c;加密…

【每日刷题】Day7

【每日刷题】Day7 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 2. 203. 移除链表元素 - 力扣&#xff08;…

重磅!Meta 发布 Llama 3,前所未有的强大功能和多模态能力|TodayAI

Meta今日宣布推出其最新一代尖端开源大型语言模型Llama 3。该模型预计很快将在多个领先的云服务平台上线&#xff0c;包括AWS、Databricks、Google Cloud、Hugging Face、Kaggle、IBM WatsonX、Microsoft Azure、NVIDIA NIM和Snowflake。 Llama 3模型得到了AMD、AWS、Dell、In…

XiaodiSec day020 Learn Note 小迪渗透学习笔记

XiaodiSec day020 Learn Note 小迪渗透学习笔记 记录得比较凌乱&#xff0c;不尽详细 php 缺陷 2024.1.29 00:32 前言 在课程安排上先讲语言缺陷&#xff0c;再讲漏洞 函数缺陷与绕过 CTF 详细点: intval strpos in_array preg_match str_replace 开始 1a 1 1admin …

代码随想录-哈希表 | 1两数之和

代码随想录-哈希表 | 1两数之和 LeetCode 1-两数之和解题思路代码复杂度难点总结 LeetCode 1-两数之和 题目链接 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那两个整数&#xff0c;并返回它们的数组下标。…

【深度学习】yolov5目标检测学习与调试

2024.4.15 -2024.4.16 完结 0.准备&&补充知识点 yolo检测算法可以实现目标检测、分割和分类任务。 项目仓库地址&#xff1a;https://github.com/ultralytics/yolov5 跟练视频&#xff1a;目标检测 YOLOv5 开源代码项目调试与讲解实战 lux下载视频神器&#xff1a;h…

2W 3KVDC 隔离 稳压单输出 DC/DC 电源模块——TPK-SAR 系列介绍

TPK-SAR系列产品是专门针对PCB上分布式电源系统中需要与输入电源隔离且输出精度要求较高的电源应用场合而设计。该产品适用于&#xff1b;1&#xff09;输入电源的电压变化≤5%&#xff1b;2&#xff09;输入输出之前要求隔离电压≥3000VDC&#xff1b;3&#xff09;对输出电压…

idea新建一个springboot项目

本文分为几个部分&#xff0c; 首先是在idea中新建项目&#xff0c; 然后是配置 项目的目录&#xff08;新建controller、service、dao等&#xff09;&#xff0c; 然后是自定义的一些工具类&#xff08;比如启动后打印地址等&#xff09;。 1.、创建篇 新建项目&#xff0…

Zookeeper和Redis分别实现分布式锁的原理

目录 分布式锁的概述 ZooKeeper实现分布式锁的原理 Redis实现分布式锁的原理 ZooKeeper分布式锁的工具类 Redis分布式锁的工具类 对比 分布式锁的概述 分布式锁是一种在分布式系统中用来同步多个进程对共享资源访问的机制。它可以保证在同一时刻&#xff0c;只有一个进程…

若依OSS如何支持本地上传,保存到服务器本地?

SysOssController改动&#xff1a; GetMapping("/downloadByName/**")public void download(HttpServletRequest request, HttpServletResponse response) throws IOException {String path (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPP…

IO基础-传统I/O模型

关于IO数据流有两种形式&#xff0c;来源于网络和磁盘分别叫做网络IO、磁盘IO。 客户端通过TCP和UDP协议将数据流发往服务端&#xff0c;服务端接收数据这个过程称为网络IO。 服务端读取本地文件数据到服务中的过程称为磁盘IO。 基于 Linux 一切皆文件的理念&#xff0c;在内…

[大模型]Qwen-7B-Chat WebDemo

Qwen-7B-Chat WebDemo 环境准备 在autodl平台中租一个3090等24G显存的显卡机器&#xff0c;如下图所示镜像选择PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 接下来打开刚刚租用服务器的JupyterLab&#xff0c;并且打开其中的终端开始环境配置、模型下载和运行demo…