输出所有的二进制数:深度优先方法与广度优先方法

题目:请编写程序输出000-111之间的所有二进制数。

在一个二叉树中,假设向左的边标记为0,向右的边标记为1,则所有的二进制数刚好对应于一个满二叉树。

对于二叉树,可以有两种遍历方式:深度优先和广度优先。深度优先可以通过递归程序 实现,广度优先可以借助于队列实现。

深度优先方法:

#include <cstdio>
int data[5];
void f(int n)
{       
	int k;
	if(n==3)
	{   
		for(k=0;k<n;k++)
			printf("%d ",data[k]);
		printf("\n");
	}
	else
	{	
		data[n]=0; f(n+1);
		data[n]=1; f(n+1);
	}
}

int main()
{
	f(0);
	return 0;
}

广度优先方法:

#include <deque>
using namespace std;
typedef struct DataStru
{
	int data[10];
	int level;
}DS;

deque <DS> q;
int main()
{
	DS d1;
	int i=1,k;
	d1.data[1]=0;
	d1.level=1;
	q.push_back(d1);
	d1.data[1]=1;
	q.push_back(d1);
	while(!q.empty())//当队列不空时循环
	{
		d1=q.front();//取出队头元素
		q.pop_front();//删掉队头元素
		if(d1.level<3)
		{
			d1.level++;//队头元素的左孩子层号加1	
			d1.data[d1.level]=0;//队头元素的左孩子值为0
			q.push_back(d1);//队头元素的左孩子加入队列
			d1.data[d1.level]=1;//队头元素的右孩子值为1
			q.push_back(d1);//队头元素的右孩子加入队列
		}
		else
		{//达到树叶,输出二进制数
			for(k=1;k<=d1.level;k++)
				printf("%d ",d1.data[k]);
			printf("\n");
		}				
	}
	return 0;
}
程序的运行结果图:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值