二叉树的存储结构 :
1. 顺序存储结构 :
完全二叉树:按从上至下、从左到右顺序存储
n个结点的完全二叉树的结点父子关系:
-
非根结点(序号 i > 1)的父结点的序号是 i / 2;
-
结点(序号为 i )的左孩子结点的序号是 2i,(若2 i <= n,否则没有左孩子);
-
结点(序号为 i )的右孩子结点的序号是 2i+1,(若2 i +1<= n,否则没有右孩子);
但是一般不用该方式,空间浪费严重
另一种顺序结构: ? ? ?
typedef struct{
elementtype data;
int parent;
}gather;
相关操作如下::
int find(elementtype x,gather s[]){ //在数组s中查找值为x的元素所属的集合
int i=0;
while(i<maxsize && s[i].data!=x) i++;
if (i>=maxsize) return -1; //未找到
while(s[i].parent>=0) i=s[i].parent;
return i; //找到x所属集合,返回树根结点在数组s中的下标
}
int combination(elementtype x,elementtype y,gather s[]){
int a=find(x,s);
int b=find(y,s);
if (a!=b){
if (-s[a].parent >= -s[b].parent){//如果集合a比较大,集合b并入集合a
s[a].parent+=s[b].parent;
s[b].parent=a;
}
else{
s[b].parent+=s[a].parent;//如果集合b比较大,集合a并入集合b
s[a].parent=b;
}
}
}
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
但根据情况的不同,有时采用数组下标==存储的值,下标对应的内容则为其父节点的下标,
而父节点对应的内容则为其子节点的个数(用负数表示),如此可大大提高查找效率。
如下图所示:(图中为-1,未改)
下图为该种方式的相关操作:
2.链表存储 :(儿子-兄弟表示法 )
typedef struct tree_node* tree;
struct tree_node{
elementtype data;
tree left;
tree right;
};