欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-22 10:16:14
...

目录

一.二叉树的广度优先遍历

参考moonbaby博客-按层遍历二叉树

二.二叉树的深度优先遍历

1.递归实现

2.非递归实现


  • 二叉树的结构定义

/*
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输出。

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

参考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

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

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);
	}
} 

 

相关标签: 算法