数据结构与算法
2021/4/18——树
对于树,我们首先要将其与一般的图相区别。图是什么,图就是有着相应连接关系的一种结构。
而所谓的树,其实就是没有回路的连通无向图。
那么这个被称为“树”的没有回路的连通无向图有什么用呢?
下面给出几种用法
一、堆(优先队列)
堆(优先队列)是基于二叉树(一种每个节点最多只有两个子节点的特殊树)。利用堆的特性,对一个数组进行排序,可将复杂度轻松降至
给出堆排序的代码实现
#include<iostream>
int a[50],h[50],num;
using namespace std;
void creat();
void signup(int i);
void swap(int *p , int *q);
void signdown(int i);
int deleteMax();
int main()
{
cin>>num;
for(int i=1;i<=num;i++)
cin>>a[i];
creat();
for(int i=1;i<=14;i++)//注意此处的14.将堆中元素完全输出。
cout<<" "<<deleteMax();
}
void creat()
{
for(int i=1;i<=num;i++)
{
h[i] = a[i];
signup(i);
}
}
void signup(int i)
{
while(i > 1)
{
int t = i;
if(h[t/2] > h[t]) t = t/2;
if(t != i)
{
swap(h[t],h[i]);
i=t;
}
if(h[t/2] < h[t]) break;
}
}
void signdown(int i)
{
while(i*2 <= num )
{
int t = i;
if(h[t] > h[t*2]) t = t*2;
if(i*2+1 <= num)
{
if(h[i*2+1] < h[t]) t = i*2+1;
}
if(t != i)
{
swap(h[t],h[i]);
i = t;
}
else break;
}
}
void swap(int *p , int *q)
{
int t;
t = *p;
*p = *q;
*q = t;
}
int deleteMax()
{
int t = h[1];
h[1] = h[num];
num--;
signdown(1);
return t;
}
二、并查集
并查集又被称为不相交集数据结构。在实现最小生成树问题上有着独特的妙用
给出并查集的实现代码(问题为《啊哈算法》p200)
#include<iostream>
using namespace std;
int f[101]={0},m,n,x,y;
int getf(int v){
if(v == f[v])
return v;
else
return getf(f[v]);
}
void merge(int r,int s){
int t1,t2;
//t1,t2负责得到相应点的祖先。
t1 = getf(r);
t2 = getf(s);
if(t1 != t2){
f[t2] = t1;
}
}
int main(){
int sum = 0;
cin>>m>>n;
for(int i=1;i<=n;i++)
{
f[i] = i;
}//记得初始化。
for(int i=1;i<=n;i++)
{
cin>>x>>y;
merge(x,y);
}
for(int i=1;i<=m;i++)
{
if(f[i] == i)
sum++;
}
cout<<sum;
}
三、在不同算法中的应用
kruskal算法、prim算法等,均有应用。
luckyJiang(算法笔记)