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

目录

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

参考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输出。

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

python实现

def preOrder(self,root):
    if root==None:
        return
    stack=[]
    stack.append(root)
    while stack:
        cur = stack.pop()
        print(cur.val)
        if cur.rchild!=None:
            stack.append(stack.rchild)
        if cur.lchild!= None:
            stack.append(stack.lchild)

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值