【题目描述】
我们都知道,火车沿途会经过各种大大小小的站,火车在可能会跳过某些站不停靠,但是肯定不会连续跳过两站及以上。假设沿途一共会有m个站台(火车起初停靠在第一站),一共有多少种不同的停站方案?
【输入】
输入的第一行为一个整数 T (0 < T < 40),接下来为 T 组测试数据,每组只有一个整数 m (0 < m < 40),表示站台的数量。
【输出】
对于每组测试数据,输出只有一行为一个整数,表示可供选择的方案数。
【算法思想】
1.世界本可以更简单但是有的人就是喜欢没事找事,简单的路走起来觉得不高级,其实,是自己很傻逼;
2.直接使用两个数字就可以解决的事情,笔者生来贱命一条,就喜欢用树的结构上去干,所以说傻逼;
3.直接使用斐波那契数列就可以解决的算法,笔者就是采用了二叉树的宽度求解,所以说不是一般的傻逼;
4.和使用非递归的思想实现图的深度遍历一样,本文只是为了数据结构而数据结构,这在算法时间消耗和空间消耗以及比这本就不多的脑细胞消耗上来说是很不划算的,所以说傻逼简直了!
综上,不要盲目数据结构,想好了兼得的方式在动笔!!!
【屌丝代码】
<pre name="code" class="cpp">#include<iostream>
#include<stack>
#include<vector>
#include<queue>
using namespace std;
typedef struct BiTNode
{
int data;
BiTNode *lc;
BiTNode *rc;
}BiTNode;
BiTNode* createTree(BiTNode*head,int lay,queue<int> q)
{
if(lay == 0)
{
head = NULL;
return NULL;
}
head = new BiTNode;
head->data = 1;
if(q.size() == 0)
{
head->lc = createTree(head->lc,lay-1,q);
q.push(head->data);
head->rc = createTree(head->rc,lay-1,q);
}
else
{
q.pop();
head->lc = createTree(head->lc,lay-1,q);
head->rc = NULL;
}
return head;
};
int widthTree(BiTNode*head,int lay)
{
queue<BiTNode*> q;
int pos,size,width(0),count;
q.push(head);
BiTNode* tmp;
while(!q.empty())
{
size = q.size();
pos = 0;
count = 0;
while(pos<size)
{
tmp = q.front();
q.pop();
count++;
if(tmp->lc!=NULL)
{
q.push(tmp->lc);
}
if(tmp->rc!=NULL)
{
q.push(tmp->rc);
}
pos++;
}
if(count>width)
{
width = count;
}
}
return width;
};
int main()
{
int time,lay_num,width;
BiTNode* head = NULL;
cin>>time; // 输入测宽次数
while(time--)
{
cin>>lay_num; // 输入二叉树层数
queue<int> q;
// cout<<q.size()<<endl;
head = createTree(head,lay_num,q); // 建树
width = widthTree(head,lay_num); // 计算二叉树,树宽。
cout<<width<<endl;
}
return 0;
}
【小结】
1.建立二叉树时,对未安排数据额的节点,赋空值是很有必要的;
2.对二叉树求取树宽时,遇到建树不标准的时候,判断节点是否存在,不仅仅是指针为空的判断很重要,树的结点数据也可以作为节点存在的判据。