二叉树
存储和权值比较
![在这里插入图片描述](https://img-blog.csdnimg.cn/b9b09f8f2f284a7ca406e444b83d5854.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54ix5Zad6LGG5rWG55qE6JGB5ry_,size_20,color_FFFFFF,t_70,g_se,x_16)
int h[N],ne[N*2],e[N*2],w[N],idx;
int dep[N];
void add(int x,int y ){
e[idx]=y,//当前节点的下一个节点序号
ne[idx]=h[x],//ne数组保存e数组对应位置的下一个节点所在的索引
h[x]=idx++;
}
void bfs(int x,int dep)//以深度为单位
{
maxn=max(dep,maxn);//记录整个二叉树的最大深度
d[dep]+=w[x];
for(int i=h[x];i!=-1;i=ne[i]){
int j=e[i];
dfs(j,dep+1);
}
}
int main()
{
int n;
cin>>n;
for(int i=1;i
add(i,2*i);
}
if(2*i+1
if(d[i]>=d[res]){
res=i;
}
}
cout
int hh=0,tt=0;//双指针记录一个队列
q[0]=1;//存储一个队列
memset(d,-1,sizeof d);//记录是否走过
d[0]=1;//d数组里存储的是边的长度
while(hh
int j=e[i];
if(d[j]==-1){
d[j]=d[i]+1;
q[tt++]=j;
}
}
} return d[n];
}
方法二:利用stl记录一个队列
int h[N],ne[N],e[N],idx;
int st[N],dis[N];
void add(int x,int y ){
e[idx]=y,//当前节点的下一个节点序号
ne[idx]=h[x],//ne数组保存e数组对应位置的下一个节点所在的索引
h[x]=idx++;
}
void bfs()
{
memset(dist,-1,sizeof dist);
dist[0]=1;
queue q;
q.push(1);
st[1]=1;
while(!q.empty()){
int t=q.front();
q.pop();
for(int i=h[i];i!=-1;i=ne[i]){
int j=e[i];
while(!st[j]){
dis[j]=dis[i]+1;
st[j]=1;//节点入队
q.push(j);
}
}
}
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i
int t=u;
if(u*2
int n;
cin>>n;
for(int i=1; i //把最小的元素删掉
cout |