深度优先与广度优先遍历:二叉树遍历的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;
}