第一天
好吧,这是一个很基础的算法,也是我第一次认识算法。
废话少说
二叉树bfs初步理解
二叉树这个概念就是一个根最多有两片叶,还可有一片还可没有;
叶也可以当根;
那么排起来就是2的指数倍的增长;
高中数学我们就知道,这样的增长速度是非常快的;
因此,当我们建立一个树的时候,我们就可以用广度优先搜索的办法来搜索在树中想要的数据;
如何来做,首先我们要设置出一个节点(结构体),一是用它来存储数据,二是用它来链接,真正实现根和叶的概念。
struct Node()
{
int data;
Nodeleft;
Noderight;
bool have_fuzhi; * 这个变量就是来看这个结构体是否有过赋值的情况*
Node():left(NULL),right(NULL),have_fuzhi(false){}
}
我们设置完成结点这个结构体以后,就要先模拟一个根出来
Noderoot; 这一步至关重要啊,没有根就没有起点。
好,有了根,我们可以为它增加叶片,也就是生长出新的根。
Node newnode()
{
return new Node;
}
来写函数
bool addnode(int newdata,int fangxiang,Nodepos)
{ if(faxiang==0) //0为左叶,1为右叶,不难理解,体会一下就好
{ if(pos->left!=NULL)
return false;
else
{
pos->left = newnode(); //申请新的空间给新的根或者说当前根的叶
pos =pos->left;
}
}
if(fangxiang==1)
{
if(pos->right!=NULL)
return false;
else
{
pos->left = newnode();
pos =pos->right;
}
}
pos->data = newdata; //赋值
}
提前申请好数组一个,
用来存储从上到下,从左到右依次的数据,实现一层一层,从左到右的递归搜索。
把bfs最核心的写在这了。
bool bfs(vector& ans)
{
queue<Node>& q;
ans.clear();
q.push(root);
while(!q.empty())
{
Node*temp = q.front();q.pop();
if(!temp.have) return false;
if(temp->left!=NULL)
temp=temp->left;
if(temp->right!=NULL)
temp=temp->right;
}
}
这个是使用队列来实现的宽度有限遍历。
其实真的没什么难理解的,觉得要想掌握好bfs 还得做一些相应的题目,应对好各个题目的格式变换。
若有写的不对的地方,请告知我这枚菜鸟。
也可以和我一起学算法哟,欢迎
q1064732420
作者:壮志小青年
来源:CSDN
原文:https://blog.csdn.net/qq_43450892/article/details/88375236
版权声明:本文为博主原创文章,转载请附上博文链接!