运用栈,递归来对二叉树深搜(前序遍历),队列来实现广搜(层序遍历)(非链表)

给定形如以下图片的二叉树:

原理:栈是先进后出,首先父节点入栈,然后父节点出栈,右儿子和左儿子分别入栈,然后循环上过程,递归的过程则看下方图片

递归输出位置的不同则造成了不同遍历,广搜则是父节点入队,然后左儿子右儿子入队,然后父节点出队,每次都是将当前节点能到达的节点位置入队,这个过程可以通过画图来理解。当前这个二叉树没必要用标记数组来标记,但是如果是其他图,则有时候入队需要标记来防止重复入队。

相关代码:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <queue>
#include <stack>
using namespace std;
queue<int> myq;
stack<int> mys;
int tree[7]{1,2,3,4,5,6,7};
void StackDfs(int num)//运用栈来实现深搜(前序遍历) 
{
	while(!mys.empty())
	{
		int node=mys.top();
		mys.pop();
		printf("%d",tree[node]);
		if(node*2+2<num)
		{
			mys.push(node*2+2);
		}
		if(node*2+1<num)
		{
			mys.push(node*2+1);
		}
	}
}
void Dfs(int node,int num)//运用递归来实现深搜(前序遍历) 
{
	printf("%d",tree[node]);
	if(node*2+1<num)
	{
		Dfs(node*2+1,num);	
	}
	if(node*2+2<num)
	{
		Dfs(node*2+2,num);
	}
}
void Bfs(int num)//运用队列来实现广搜 
{
	while(!myq.empty())
	{
		int node=myq.front();
		printf("%d",tree[node]);
		if(node*2+1<num)
		{
			myq.push(node*2+1);
		}
		if(node*2+2<num)
		{
			myq.push(node*2+2);
		}
		myq.pop();
	}
}
int main(int argc, char *argv[]) {
	mys.push(0);
	myq.push(0);
	StackDfs(7);
	printf("\n");
	Dfs(0,7);
	printf("\n");
	Bfs(7);
	return 0;
}

运行效果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值