数据结构——树的存储结构

最近期末了,就整理一下二叉树吧 ~ 希望能帮到大家 

  •  双亲表示法(适用于找双亲)

结构性数组:用数组保存结点,结点里又包含数据和双亲下标

#define maxsize  100
typedef char datatype;
typedef struct node
{    
    datatype  data;
    int parent;//双亲下标
}node;//结点结构体

typedef struct tree
{
    node treelist[maxsize];//把结点放在数组中
    int legent,root;//定义数组中实际结点的个数和根节点的位置
}tree;

特点:便于找双亲结点。 

  • 孩子表示法(适用于找孩子)

(1.指针方法:)

#define m 3
typedef struct tree 
{
    char data;
    struct tree *child[m];//指向孩子的指针数组
}node,*tree;

(2.链表方法:) 

用数组,数组中的每个单元包括数值data和孩子链表头指针,孩子链表头指针包含了child即孩子的下标,以及下一个孩子指针。

#define size 3
typedef struct tree //孩子结点
{
    int child;
    struct tree *next;//指向下一个孩子
}node,*tree;
typedef struct//双亲结点(也是每个结点的类型)
{
    char data;
    tree firstchild;//孩子链表头指针
}box;
typedef struct
{
    box node[size];
    int legent,root;//结点个数和根结点下标
}

(3.数组方法:) 

用一个数组,数组中的每个单元保存结点,结点包含数值和三个孩子(孩子以数组形式存储)

#define m 3
#define maxsize 100
typedef struct tree //树中结点的类型
{
    char data;
    int child[m];
}node,*tree;
node tree[maxsize];
int root;
int legent;
  • 孩子兄弟表示法: (二叉树表示法)

 用二叉链表方式存储。

typedef struct node
{
    char  data;
    struct node *firstchild,*rightsibling;//指向第一个孩子和第一个孩子的右兄弟
}

 每个结点的孩子是一个单链表,头指针为双亲的firstchild。

 可以用二叉链表来作为树和二叉树的媒介。
  • 将树转化为二叉树:(兄弟相连留长子)

        在兄弟之间加线,只保留双亲和第一个孩子的连线,顺时针旋转45度

  •  将二叉树转化为树:(左孩右右连双亲)

        加线:若P是双亲结点的左孩子,将P的所有右孩子都与P连起来;

        将原二叉树中的双亲与右孩子的连线抹去;

        逆时针旋转45度。

 

以上就是树的存储结构,如有错误,敬请指正,谢谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值