深度优先与广度优先遍历:二叉树遍历的DFS和BFS实现

二叉树的深度优先遍历(DFS)与广度优先遍历(BFS)

深度优先与广度优先遍历:二叉树遍历的DFS和BFS实现

深度优先遍历:从根节点开始,先沿着左子树的方向进行纵向的遍历,一直找到叶子节点。接着回溯到之前的那个节点,再对右子树的节点进行遍历。如此反复,直至遍历完所有能够到达的节点。

广度优先遍历:从根节点开始进行操作。首先在横向方向上遍历二叉树的层段节点,接着在此基础上再进行纵向方向上遍历二叉树的层次。

DFS:ABDECFG

BFS:ABCDEFG

DFS实现:

数据结构:栈

将父节点入栈,接着让父节点出栈。先把右子节点入栈,然后再把左子节点入栈。通过递归的方式遍历所有的节点就可以了。

BFS实现:

数据结构:队列

父节点被放入队列,接着父节点从队列中取出。首先将左子节点放入队列,然后把右子节点放入队列。通过递归的方式遍历所有节点就可以了。

#include 
#include 
#include 
#include 
#include 
using namespace std;
 
typedef struct Node {
    char data;
    struct Node *lchild;
    struct Node *rchild;
} *Tree;
//Tree 是一个node指针的类型定义
int index = 0;  //全局索引变量
//二叉树构造器,按先序遍历顺序构造二叉树
//无左子树或右子树用'#'表示
创建一个名为 treeNodeConstructor 的函数,该函数用于构建树的节点。它接受一个 Tree 类型的引用 root 和一个字符数组 data 作为参数。在函数内部,通过特定的方式来构建树的节点,并将相关数据存储在树结构中。
    char e = data[index++];
    if(e == '#'){
        root = NULL;
    }else{
根节点等于通过动态内存分配函数 malloc 分配的大小为 Node 结构体大小的内存空间,并将其强制转换为 Node 类型的指针。
        root->data = e;
通过 treeNodeConstructor 函数来构建根节点的左子树,传入的参数为根节点的左子节点 root->lchild 和数据 data ,以此实现递归构建左子树的操作。
使用 data 递归构建根节点的右子树,即 treeNodeConstructor(root->rchild, data) ;
    }
}
//深度优先遍历
定义一个函数 depthFirstSearch,参数为 Tree 类型的 root。
    stack nodeStack;  //使用C++的STL标准模板库
    nodeStack.push(root);
    Node *node;
    while(!nodeStack.empty()){
	    node = nodeStack.top();
		cout<data;//遍历根结点
        nodeStack.pop();
        if(node->rchild){
将 node 的右子树压入 nodeStack 中;先进行这一操作;把右子树压栈这一步骤先执行;将右子树推入 nodeStack 里;先把右子树压到 nodeStack 上;先将右子树压入到 nodeStack 中;先把 node 的右子树压入 nodeStack 内;先将 node 的右子树压进 nodeStack 里;先把 node 的右子树压入 nodeStack 之中;先将 node 的右子树压入到 nodeStack 这个容器中;先将 node 的右子树压入 nodeStack 这个数据结构中;先将 node 的右子树压入 nodeStack 这一结构中;先将 node 的右子树压入 nodeStack 这个栈中;先将 node 的右子树压入 nodeStack 这个数据栈中;先将 node 的右子树压入 nodeStack 这个存储结构中;先将 node 的右子树压入 nodeStack 这个用于存储的结构中;先将 node 的右子树压入 nodeStack 这个用于存储数据的结构中;先将 node 的右子树压入作为存储用途的 nodeStack 中;先将 node 的右子树压入作为数据存储用途的 nodeStack 中;先将 node 的右子树压入专门用于存储的 nodeStack 中;先将 node 的右子树压入专门用于存储数据的 nodeStack 中;先将 node 的右子树压入以存储为目的的 nodeStack 中;先将 node 的右子树压入以存储数据为目的的 nodeStack 中;先将 node 的右子树压入用于存储目的的 nodeStack 中;先将 node 的右子树压入用于存储数据目的的 nodeStack 中。
        }
        if(node->lchild){
将左子树压入栈中,具体做法是把 node 的左子树压入 nodeStack 栈中。
        }
    }
}
//广度优先遍历
结束 breadthFirstSearch 函数的执行
    queue nodeQueue;  //使用C++的STL标准模板库
    nodeQueue.push(root);
    Node *node;
    while(!nodeQueue.empty()){
        node = nodeQueue.front();
        nodeQueue.pop();
        cout<data;//遍历根结点
        if(node->lchild){
将左子树推入队列,即 nodeQueue.push(node->lchild) ;
        }
        if(node->rchild){
将节点的右子树推入到节点队列中。
        }
    }
}
int main() {
上图所示的二叉树的先序遍历序列,其中用“#”来表示该结点没有左子树或者没有右子树。
字符数组 data 的大小为 15,其中包含字符 'A'、'B'、'D'、'#'、'#'、'E'、'#'、'#'、'C'、'F'、'#'、'#'、'G'、'#'、'#'。
    Tree tree;
treeNodeConstructor 函数用于构建树节点,它接收树对象 tree 和数据 data 作为参数。
    printf("深度优先遍历二叉树结果: ");
    depthFirstSearch(tree);
    printf("\n\n广度优先遍历二叉树结果: ");
    breadthFirstSearch(tree);
    return 0;
} 

你可能想看:
« 上一篇
下一篇 »

相关推荐

FreeBasic:强大免费开源的64位basic编译器及应用优势

2025年05月10日

82阅读

脊柱侧弯矫正方法大盘点:运动康复、支具矫正等多种方式

2025年05月09日

87阅读

如何在winForm标题栏去掉标题文字且任务栏图标正常显示

2025年05月09日

86阅读

十一黄金周促销广告词大全,国庆购物狂欢等你来

2025年05月09日

78阅读

关闭快速编辑模式及插入模式,设置控制台指定文字颜色举例

2025年05月09日

63阅读

黄金搭档低糖高钙饮品包装及成分功效全解析,适合人群要知晓

2025年05月09日

91阅读