二叉树DFS/BFS实现(C++)

2023-05-16

深度优先搜索算法(Depth First Search)

DFS是搜索算法的一种。它沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。

 

如上图所示的二叉树:

A 是第一个访问的,然后顺序是 B、D,然后是 E。接着再是 C、F、G。那么,怎么样才能来保证这个访问的顺序呢?

分析一下,在遍历了根结点后,就开始遍历左子树,最后才是右子树。因此可以借助堆栈的数据结构,由于堆栈是后进先出的顺序,由此可以先将右子树压栈,然后再对左子树压栈,这样一来,左子树结点就存在了栈顶上,因此某结点的左子树能在它的右子树遍历之前被遍历。

广度优先搜索算法(Breadth First Search)

又叫宽度优先搜索,或横向优先搜索。是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。

 

如上图所示的二叉树,A 是第一个访问的,然后顺序是 B、C,然后再是 D、E、F、G。那么,怎样才能来保证这个访问的顺序呢?
借助队列数据结构,由于队列是先进先出的顺序,因此可以先将左子树入队,然后再将右子树入队。这样一来,左子树结点就存在队头,可以先被访问到。

代码实现:

#include<iostream>
#include <queue>
#include<stack>
using namespace std;
 
 
struct Node
{
    int nVal;
    Node *pLeft;
    Node *pRight;
 
    Node(int val,Node* left=NULL,Node * right=NULL):nVal(val),pLeft(left),pRight(right){}; //构造
};
// 析构
void DestroyTree(Node *pRoot)   
{
    if (pRoot==NULL)
        return;
 
    Node* pLeft=pRoot->pLeft;
    Node* pRight=pRoot->pRight;
 
    delete pRoot;
    pRoot =NULL;
 
    DestroyTree(pLeft);
    DestroyTree(pRight);
 
}
 
 
// 用queue实现的BFS
void BFS(Node *pRoot)
{
    if (pRoot==NULL)
        return;
 
    queue<Node*> Q;
 
    Q.push(pRoot);
 
    while(!Q.empty())
    {
        
        Node *node = Q.front();
 
        cout<<node->nVal<<"->";
        if (node->pLeft!=NULL)
        {
            Q.push(node->pLeft);
        }
 
        if (node->pRight!=NULL)
        {
            Q.push(node->pRight);
        }
 
        Q.pop();
    }
 
    cout<<endl;
}
 
 
// DFS的递归实现
void DFS_Recursive(Node* pRoot)
{
    if (pRoot==NULL)
        return;
 
    cout<<pRoot->nVal<<" ";
 
    if (pRoot->pLeft!=NULL) 
        DFS_Recursive(pRoot->pLeft);
 
 
    if (pRoot->pRight!=NULL)
        DFS_Recursive(pRoot->pRight);
    
}
 
// DFS的迭代实现版本(stack)
void DFS_Iterative(Node* pRoot)
{
    if (pRoot==NULL)
        return;
 
    stack<Node*> S;
    S.push(pRoot);
 
    while (!S.empty())
    {
        Node *node=S.top();
        cout<<node->nVal<<",";
 
        S.pop();
 
        if (node->pRight!=NULL)
        {
            S.push(node->pRight);
        }
 
        if (node->pLeft!=NULL)
        {
            S.push(node->pLeft);
        }
        
    }
 
}
 
 
// 打印树的信息
void PrintTree(Node* pRoot)
{
    if (pRoot==NULL)
        return;
 
    cout<<pRoot->nVal<<" ";
 
    if (pRoot->pLeft!=NULL)
    {
        PrintTree(pRoot->pLeft);
    }
 
    if (pRoot->pRight!=NULL)
    {
        PrintTree(pRoot->pRight);
    }
}
 
int main()
{
    Node *node1=new Node(4);
    Node *node2=new Node(5);
    Node *node3=new Node(6);
 
    Node* node4=new Node(2,node1,node2);
    Node* node5=new Node(3,node3);
    Node* node6=new Node(1,node4,node5);
 
 
    Node* pRoot = node6;
    //PrintTree(pRoot);
    //DFS_Recursive(pRoot);
 
    DFS_Iterative(pRoot);
    DestroyTree(pRoot);
 
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二叉树DFS/BFS实现(C++) 的相关文章

  • Oil Deposits(BFS)

    The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits GeoSurvComp works with one
  • 【数据结构与算法学习】图的深度优先遍历(DFS算法)

    目录 一 什么是图的遍历 二 深度优先遍历 DFS 的基本思想 三 深度优先遍历 DFS 的步骤详解 四 深度优先遍历 DFS 的代码实现 一 什么是图的遍历 图的遍历 指的是从图中的任一顶点出发 对图中的所有顶点访问一次且只访问一次 图的
  • 八数码问题【康托展开+BFS】

    Vijos 题库 八数码问题 背景 Yours和zero在研究A 启发式算法 拿到一道经典的A 问题 但是他们不会做 请你帮他们 描述 在3 3的棋盘上 摆有八个棋子 每个棋子上标有1至8的某一数字 棋盘中留有一个空格 空格用0来表示 空格
  • 学渣带你刷Leetcode0017. 电话号码的字母组合

    题目描述 给定一个仅包含数字 2 9 的字符串 返回所有它能表示的字母组合 给出数字到字母的映射如下 与电话按键相同 注意 1 不对应任何字母 示例 输入 23 输出 ad ae af bd be bf cd ce cf 说明 尽管上面的答
  • 基础算法题——德邦国王(dfs、剪枝)

    德邦国王 题目还算中规中矩 就是剪枝比较麻烦 解题思路 dfs 剪枝 移动次数不超过设定值 M 若有解 则后面的步骤不可大于该解的值 不断查询完美矩阵与当前矩阵不同的个数 t t 1 为最快可将当前矩阵移动成完美矩阵的步数 若 t 1 已经
  • 基础算法题——迷宫(递推)

    迷宫 题目链接 解题思路 暴力法 利用 dfs 遍历每一条可能的路径 将遍历的权值和不断取余 不足 当 n m 取较大的情况下 所遍历的路径可能会暴增 出现超时的情况 递推法 从题目上我们可以发现 最终的权值和是要对 mod 取余的 利用这
  • 【算法学习笔记】17:DFS与BFS

    1 DFS 深度优先搜索常用于解决需要给出所有方案的问题 因为它的搜索顺序就是能够得到一个完整的搜索路径 方案 后回退再去搜索其它的方案 1 1 例题 排列数字 由于要求所有排列的方案 可以每次从 1 n 1 n 1 n里拿一个数字 然后记
  • 岛屿类-网格类问题-DFS

    本文讲解200 岛屿数量问题 属于常见的岛屿类 网格类问题 本题使用DFS的思想 1 题目 给你一个由 1 陆地 和 0 水 组成的的二维网格 请你计算网格中岛屿的数量 岛屿总是被水包围 并且每座岛屿只能由水平方向和 或竖直方向上相邻的陆地
  • 图的深度优先遍历:DFS遍历

    图的深度优先遍历 DFS遍历 提示 系列图的文章 提示 大厂笔试面试都可能不咋考的数据结构 图 由于图的结构比较难 出题的时候 很难把这个图的数据搞通顺 而且搞通顺了题目也需要耗费太多时间 故笔试面试都不会咋考 笔试大厂考的就是你的贪心取巧
  • 奶酪【BFS】

    题目链接 点从z 0为起点 想跑到z h 只能在球内 或者是球表层上跑 问能否从起点跑到终点 直接暴力bfs判断即可 include
  • Codeforces-1454E Number of Simple Paths(基环树-思维)

    题目大意 给你n个点 n条边 求图中简单路径的个数 题目思路 n个点n条边 那么图中一定有一个环 拿这个图来讲 我们将两点间的关系分为4种 1 两点都在环上 简单路径的个数为2 例如2与5 2 一个点在环上一个点不在环上 简单路径个数为2
  • 深度、广度优先搜索

    文章目录 二 图的遍历 2 1 深度优先搜索 DFS DFS森林 应用 2 2 广度优先搜索 BFS 基本操作 应用 二 图的遍历 2 1 深度优先搜索 DFS DFS森林 Vertextype GetVex ALGraph G int v
  • 题目 1548: [蓝桥杯][算法提高VIP]盾神与砝码称重

    时间限制 1Sec 内存限制 128MB 提交 782 解决 331 题目描述 有一天 他在宿舍里无意中发现了一个天平 这 个天平很奇怪 有n个完好的砝码 但是没有游码 盾神为他的发现兴奋不已 于是他准备去称一称自己的东西 他准备好了m种物
  • 长草(Python)

    题目描述 小明有一块空地 他将这块空地划分为 n 行 m 列的小块 每行和每列的长度都为 1 小明选了其中的一些小块空地 种上了草 其他小块仍然保持是空地 这些草长得很快 每个月 草都会向外长出一些 如果一个小块种了草 则它将向自己的上 下
  • 链式前向星存树图和遍历它的两种方法【dfs、bfs】

    目录 一 链式前向星存图 二 两种遍历方法 一 链式前向星存图 n个点 n 1条边 链式前向星把上面的树图存下来 输入 9 代表要存进去n个点 1 2 下面是n 1条边 每条边连接两个点 1 3 1 7 2 4 4 5 4 6 3 8 3
  • Fix a Tree【Codeforces 699 D】【dfs + 树的性质】

    Codeforces Round 363 Div 2 D 题意 有N个点 每个点i都有一个父节点p i 如果 i p i 则是说明i结点是根结点 现在我们给出这样的1 N的p i 这可能是不合法的 问 我们应该最少改变多少个使它变成一棵合法
  • BFS(广度优先算法)——判断无向简单图中任意两点是否连通

    include
  • 仙岛求药 —— dfs 与 bfs求解

    样例输入1 8 8 样例输出1 10 样例输入2 9 6 样例输出2 1 dfs ps 使用dfs会运行超时 30组测试数据只能通过部分 其实这种最短路径 最少操作的问题最好还是靠bfs解决 import java util Scanner
  • 数据结构——图的DFS(深度优先遍历)- C语言代码实现

    图的深度优先遍历的基本思想 从图中某顶点v出发 1 访问顶点v 2 依次从v的未被访问的邻接点出发 对图进行深度优先遍历 直至图中和v有路径相通的顶点都被访问 3 若此时图中尚有顶点未被访问 则从一个未被访问的顶点出发 重新进行深度优先遍历
  • DFS的个人理解和测试例题

    深度优先搜索 DFS 是一种搜索手段 可以理解为 它从某个位置 起点 开始 沿着一条路不断地向前走直到尽头 然后退后一步 去走其它没走过的路 没有的话 再退后一步 再去选择 直到找到目的地 终点 例如下图 从A 起点 开始走 先走ABD 在

随机推荐

  • 车路协调系统图

  • c++ 两个vector之间相互赋值,或在一个后面追加另一个

    方法1 xff1a vector lt int gt v1 v2 声明 方法2 xff1a vector lt int gt v1 v1 swap v2 将两个容器内的元素交换 需要构建临时对象 xff0c 一个拷贝构造 xff0c 两次赋
  • 6月8 力扣 回文数和验证回文串

    9 回文数 难度简单1057收藏分享切换为英文关注反馈 判断一个整数是否是回文数 回文数是指正序 xff08 从左向右 xff09 和倒序 xff08 从右向左 xff09 读都是一样的整数 示例 1 输入 121 输出 true 示例 2
  • C++11 并发指南一(C++11 多线程初探)

    相信 Linux 程序员都用过 Pthread 但有了 C 43 43 11 的 std thread 以后 xff0c 你可以在语言层面编写多线程程序了 xff0c 直接的好处就是多线程程序的可移植性得到了很大的提高 xff0c 所以作为
  • 二分搜索binary search和贪婪算法

    二分搜索binary search 定义 xff1a 二分搜索也称折半搜索 xff0c 是一种在有序数组中查找某一特定元素的搜索算法 运用前提 xff1a 必须是排好序的 输入并不一定是数组 xff0c 也可能是给定一个区间和终止的位置 优
  • 面试题52. 两个链表的第一个公共节点

    面试题52 两个链表的第一个公共节点 难度简单51收藏分享切换为英文关注反馈 输入两个链表 xff0c 找出它们的第一个公共节点 如下面的两个链表 xff1a 在节点 c1 开始相交 示例 1 xff1a 输入 xff1a intersec
  • 求解两个字符串的最长公共子序列

    一 xff0c 问题描述 给定两个字符串 xff0c 求解这两个字符串的最长公共子序列 xff08 Longest Common Sequence xff09 比如字符串1 xff1a BDCABA xff1b 字符串2 xff1a ABC
  • leetcode刷题6.16 树的层序遍历,树的序列化

    给你一个二叉树 xff0c 请你返回其按 层序遍历 得到的节点值 xff08 即逐层地 xff0c 从左到右访问所有节点 xff09 示例 xff1a 二叉树 xff1a 3 9 20 null null 15 7 3 9 20 15 7
  • 深度优先及广度优先算法

    深度优先搜索算法DFS 广度优先搜索算法BFS 在猪呢个算法知识点中占比非常大 xff0c 应用最多的地方是对图进行遍历 xff08 树以为是图的一种 xff09 深度优先搜索算法DFS DFS解决的 是连通性的问题 xff0c 及给定两个
  • 厄拉多塞筛法 快速求质数 /回文子串

    西元前250年 xff0c 希腊数学家厄拉多塞 Eeatosthese 想到了一个非常美妙的质数筛法 xff0c 减少了逐一检查每个数的的步骤 xff0c 可以比较简单的从一大堆数字之中 xff0c 筛选出质数来 xff0c 这方法被称作厄
  • Docker部署Sonarqube

    1 下载镜像 docker pull registry span class token punctuation span cn span class token operator span shenzhen span class toke
  • leetcode刷题 旋转链表

    92 反转链表 II 难度中等393 反转从位置 m 到 n 的链表 请使用一趟扫描完成反转 说明 1 m n 链表长度 示例 输入 1 gt 2 gt 3 gt 4 gt 5 gt NULL m 61 2 n 61 4 输出 1 gt 4
  • 分布式实时处理系统——C++高性能编程 RAII resource acquisition is initialization

    分布式实时处理系统 C 43 43 高性能编程 前言 基于通信基础 xff0c 介绍Hurricane实时处理系统的工程实现 xff0c 主要使用C 43 43 语言 一 IPC socket 异步I O epoll 二 C 43 43 1
  • 6月21 刷题思考

    1 RALL相关知识点 2 std set的使用 xff1f xff1f 不熟练 3 一个无序整数数组中找到最长连续序列 4 Two Sum 问题 Data structure design 5 i 43 43 在两个线程里边分别执行100
  • V2X就是Vehicle To Everything 国标中有五种消息BSM、RSI、RSM、SPAT、MAP

    前面讲到V2X就是Vehicle To Everything xff0c 即车队外界所有信息的交换 xff0c 这里的X代表Everything xff0c 在V2X概念中 xff0c 我们将它看作四大部分 xff0c 车与车通信 xff0
  • 6月23 leetcode 二进制求和

    67 二进制求和 难度简单404收藏分享切换为英文关注反馈 给你两个二进制字符串 xff0c 返回它们的和 xff08 用二进制表示 xff09 输入为 非空 字符串且只包含数字 1 和 0 示例 1 输入 a 61 34 11 34 b
  • 利用栈实现树的中序遍历

    94 二叉树的中序遍历 难度中等537收藏分享切换为英文关注反馈 给定一个二叉树 xff0c 返回它的中序 遍历 示例 输入 1 null 2 3 1 2 3 输出 1 3 2 进阶 递归算法很简单 xff0c 你可以通过迭代算法完成吗 x
  • STL中的set详解

    1 关于set C 43 43 STL 之所以得到广泛的赞誉 xff0c 也被很多人使用 xff0c 不只是提供了像vector string list等方便的容器 xff0c 更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构
  • 你真的了解二分查找吗?

    传统的二分查找算法 提到二分查找 xff0c 相信很多人都不陌生 xff0c 大学学数据结构的时候老师都讲过 xff0c 它是一种效率较高的查找方法 xff0c 基于顺序存储结构的线性表 xff0c 且要求表中元素按关键字有序排列 假设元素
  • 二叉树DFS/BFS实现(C++)

    深度优先搜索算法 xff08 Depth First Search xff09 DFS是搜索算法的一种 它沿着树的深度遍历树的节点 xff0c 尽可能深的搜索树的分支 当节点v的所有边都己被探寻过 xff0c 搜索将回溯到发现节点v的那条边