二叉树的广度优先遍历(BFS)与深度优先遍历(DFS)
程序员文章站
2022-05-22 10:16:14
...
目录
-
二叉树的结构定义
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
一.二叉树的广度优先遍历
广度优先排序(宽度优先排序或者横向优先搜索)是从根结点开始沿着树的宽度搜索遍历。按层次的去遍历。依次遍历根节点,然后是左孩子和右孩子。
从上到下,从左到右依次打印出来,就是ABCDEFG。
实现思路,用队列实现。A入队,从根结点开始。接着A的两个孩子不空,BC入队(A出队,队头指向B);然后B的两个孩子DE入队,B出队,队头指向C;C的两个孩子FG进入,C出队;最后将DEFG输出。
参考moonbaby博客-按层遍历二叉树
二.二叉树的深度优先遍历
深度优先遍历沿着树的深度遍历树的节点,尽可能深的搜索树的分支。
思想是从上至下,对每一个分支一直往下一层遍历直到这个分支结束,然后返回上一层,对上一层的右子树这个分支继续深搜,直到一整棵树完全遍历。
深度优先遍历有三种遍历方法:
前序遍历、中序遍历、后序遍历
1.递归实现
- 前序遍历(根左右)
void PreOrderTrverse(TreeNode* root){
if(root==NULL)
return;
printf("%d",root->val);
if(root->left !=NULL)
PreOrderTrverse(root->left);
if(root->right !=NULL)
PreOrderTrverse(root->right);
}
- 中序遍历(左根右)
void InOrderTrverse(TreeNode* root){
if(root==NULL)
return;
if(root->left !=NULL)
PreOrderTrverse(root->left);
printf("%d",root->val);
if(root->right !=NULL)
PreOrderTrverse(root->right);
}
- 后序遍历(左右根)
void PostOrderTrverse(TreeNode* root){
if(root==NULL)
return;
if(root->left !=NULL)
PreOrderTrverse(root->left);
if(root->right !=NULL)
PreOrderTrverse(root->right);
printf("%d",root->val);
}
2.非递归实现
深度优先遍历是遍历根节点,左子树,最后遍历右子树。利用栈结构,先将右子树压栈,然后在对左子树压栈。先进的后出。此时,左子树节点是在top上的,可以先遍历左子树。
输出顺序为:ABDECFG
void depthFirstSearch(TreeNode* root){
stack<TreeNode*> sta;
//头节点入栈
sta.push(root);
TreeNode* p;
while(!sta.empty()){
p=sta.top();
printf("%d",p->val); //遍历根节点
sta.pop();
if(p->right != NULL) //先压栈右子树
sta.push(p->right);
if(p->left != NULL) //后压栈左子树
sta.push(p->left);
}
}
推荐阅读
-
深度优先遍历,广度优先遍历实现对象的深拷贝
-
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
-
PHP实现二叉树的深度优先与广度优先遍历方法
-
深度优先遍历,广度优先遍历实现对象的深拷贝
-
可能是目前为止最为详细的深度优先搜索DFS和广度优先搜索BFS算法分析
-
数据结构与算法-----BFS与DFS(广度优先搜索与深度优先搜索)
-
数据结构与算法_深度优先搜索(DFS)与广度优先搜索(BFS)详解
-
Java数据结构与算法:图、图的概念、深度优先搜索DFS、广度优先搜索BFS、思路分析、代码实现
-
【数据结构】图的遍历——深度优先搜索DFS、广度优先搜索BFS
-
数据结构与算法————图的遍历DFS深度优先搜索和BFS广度优先搜索