北京交通大学计算机专业考研辅导班笔记(数据结构)(5)
北京交通大学 /2009-04-04
}
}
25. 已知一棵树的层次序列以及各节点的度,建立该树的二叉链表结构。(未考过)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
数组 a A B H L C D G I M E F J K N //存放结点
数组 b 3 3 1 1 0 2 0 2 1 0 0 0 0 0 //存放结点的度
Void Tree (Cstree bt, char *a, char *b, int n)
{ if (n= =0) bt=Null;
else { i=1; qq.front=0; qq.rear=1; //i是是数组下标
p=(CsNode*)malloc(sizeof(CsNode));
p->data=a[i]; p->du=b[i]; p->snib=Null; //生成第一个结点,右子树必为空
bt=p; i++; qq.elem[qq.rear]=p;
if (n= =1) bt->fch=Null;
else { while (qq.front!=qq.rear) //不相等是为空
{qq.front++; p=qq.elem[qq.front]; j=p->du;
if (j= =0) p->fch=Null; //叶子节点时
else {while j>0 //兄弟结点加入二叉树,右子树一直往下
{ q=(CsNode*)malloc(sizeof(CsNode));
q->data=a[i]; q->du=b[i];
if (j= =p->du) p->fch=q;
else q1->snib=q;
qq.rear ++; qq.elem[qq.rear]=q;
q1=q; i++; j--;
}
}
}
}
}
26. 已知数组data[1..n]存放一森林的先序序列。在brother[1..n]中存放每个结点的右兄弟在数组data[]中的下标,约定brother[i]中存放data[i]的右兄弟下标,如不存在右兄弟,其内容为0,设计算法构造该森林的二叉链表(未考过)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
data A B C D E F G H I J K L M N O P Q R
brother 15 8 4 7 6 0 0 12 0 11 0 0 0 0 18 17 0 0
Void crt_forest (tlink &T, int k1, int k2)
//T为第一棵树的树根指针,k1和k2为建森林所对应的数组区域的首尾下标
{ if (k1>k2) T=Null; //对于本例k1=1,k2=18
else { T=(csnode*)malloc(sizeof(csnode));
T->data=data[k1];
If (brother[k1]= =0) //k1无右兄弟,则在data中从k+1到k2都是k1的子孙
{ crt_forest(T->fch,k1+1, k2); T->nsib=Null;}
else //在data中从k+1到brother[k1]-1是k1的子孙,从brother[k1]
到k2是k1的右兄弟分支
{ crt_forest(T->fch, k1+1,brother[k1]-1);
crt_forest(T->nsib,brother[k1],k2);
}
}
}
27. 哈夫曼树(要求会构造)
第七章:图
1. 掌握邻接矩阵和邻接表
2. 十字链表,邻接多重表不要求编程,但应该能看懂
3. 时间复杂度:邻接矩阵O(n**2) 邻接表O(n+e)
4. 无向连通图:最多有n(n+1)/2最少有n-1条边
有向连通图:最多有n(n-1) 最少有n条弧
5.最小生成树的两个算法要求掌握
prim算法书上有;
kruskal算法
//构造无向图的最小生成树,其中用struct edges表示边bv, to表示一条边的两个端点,w表示该边的权值
#define Max 100
struct edges { int bv, tv, w;}
typedef sturct edges edgeset[Max];
int seeks(int set[], int v)
{ int i=v;
while (set[i]>0) i=set[i];
return(i);
}
kruskal(ge,n,e)
{ int n,e; edgeset ge; //将图中的边按权值由小到大存放在数组ge中
int set[Max], v1,v2,i,j;
for (i=1;i<=n;i++) set[i]=0; i=1; j=1;
while (j<n&&i<=e)
{v1=seek(set, ge[i].bv);
v2=seek(set, ge[i].tv);