二叉树
对于完全二叉树,,由于其特殊的性质(第k节点的左子节点编号2k,右子节点编号2k+1),可以直接利用此性质建树:
void build(int l,int r,int rt)
{
if(l==r)
{
sum[rt]=a[l];//a[i]是原数组
return;}
int m=(l+r)>>1;
//递归
build(l,m,rt<<1);
build(m+1,r,rt<<1|1);//rt为当前节点编号
}
(线段树)
层次遍历二叉树
对于需要动态建树的问题,可以通过指针或者数组来建立节点之间的联系
struct node
{
bool value;
int v;
node *left,*right;
node():value(false),left(NULL),right(NULL){}//构造函数
};
node*root;
每次建立新节点都要申请新内存,调用一次newnode函数:
node*newnode(){return new node();}
建立根节点并向左或向右走:
node*u=root;
if(u->left==NULL)u->=newnode();
u->=left;
if(u->right==NULL)u->=newnode();
u->=right;
邻接表和邻接矩阵
用于存储图
邻接矩阵用的二维数组在图节点数过多时很容易超出内存,但用起来方便,适合节点数较少的图或者稠密图
ai即表示从i指向j的边的权值,无此条边就可以设为无穷
邻接表可以用纯数组表示或者用指针,个人喜欢数组:
int n,m,i;
int u[m+1],v[m+1],w[m+!];
int first[n+1],next[m+!];
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
first[i]=-1;
}
for(i=1;i<=m;i++)//关键
{
scanf("%d%d%D",&u,&v,&w);
next[i]=first[u[i]];
first[u[i]]=i;
}
读取部分:
for(int i=1;i<=n;i++)
{
k=first[i];
while(k!=-1)
{
printf("输出内容");
k=next[k];
}
}
如果待存储的图有n个节点,m条边
first数组用来存储当前读入的边的起始点,即first数组长度为n;每读入一条边,更新next数组,next数组表示:指向当前存储的边的起始点的上一条边的编号,没有上一条边就赋值-1。即每一条边都对应next数组一个值,next数组长度为m。