我就只整理了计算二叉树的宽度和直径的关于广度优先和深度优先代码思路,都是OJ的标程代码,简洁大气易理解!希望俺也能掌握这些个思想!!!
①BFS计算二叉树的宽度
用队列结构存每一层的节点数量+广搜思想
#include <iostream>
#include <queue>
using namespace std;
int n,ans=0,child[105][3];
int main()
{
cin>>n;
for(int i=1;i<n;i++)
{
int x,y;
cin>>x>>y;
if(!child[x][1])
child[x][1]=y;
else
child[x][2]=y;
}
queue<int>q;
q.push(1);
while(!q.empty())
{
int len=q.size();
ans=max(ans,len);
for(int i=0;i<len;i++)
{
int e;
e=q.front();
q.pop();
if(child[e][1])
q.push(child[e][1]);
if(child[e][2])
q.push(child[e][2]);
}
}
cout<<ans;
return 0;
}
②DFS计算二叉树的直径
#include <iostream>
#include <queue>
using namespace std;
int n,ans=0,child[105][3];
int DFS(int root)
{
if(!root)
return 0;
int lchild=DFS(child[root][1]);
int rchild=DFS(child[root][2]);
int len=max(lchild,rchild)+1;//最大深度
ans=max(ans,lchild+rchild);
return len;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<n;i++)
{
int x,y;
cin>>x>>y;
if(!child[x][1])
child[x][1]=y;
else
child[x][2]=y;
}
DFS(1);
cout<<ans;
return 0;
}