二叉树的存储结构

二叉树的存储结构 :

1. 顺序存储结构 :

完全二叉树:按从上至下、从左到右顺序存储

n个结点的完全二叉树的结点父子关系:

  1. 非根结点(序号 i > 1)的父结点的序号是 i / 2;

  2. 结点(序号为 i )的左孩子结点的序号是 2i,(若2 i <= n,否则没有左孩子);

  3. 结点(序号为 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;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值