题目:请编写程序输出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;
}
程序的运行结果图: