树的顺序存储结构

目录

一、双亲表示法(顺序存储)

二、孩子表示法(顺序+链式存储)

三、孩子兄弟表示法(链式存储)

四、二叉树转换为树

五、森林和二叉树的转换

六、小结

下一篇: 树和森林的遍历


一、双亲表示法(顺序存储)

 

实现:

#define MAX_TREE_SIZE 100//数的最大结点

typedef struct{

int data;//数据域

int parent;//双亲域(双亲数组下标)

}PTNode;

typedef struct{//树的类型

PTNode nodes[MAX_TREE_SIZE];//双亲表示

int n;//结点数

}PTree;

/*

增加时直接在数组尾部增加

删除叶子结点时有两种方案

1、将要删除的结点指向双亲结点的指针置为-1(会导致遍历时要多判断一下)

2、将数组最后一个数据移到要删除的位置

增加和操作的最后要更改结点数n

但是要是删除的不是叶子结点?

则要找到该结点为根的子树一并删除

所以双亲表示法的

优点是:查指定结点的双亲很方便

缺点是:查找指定的孩子只能从头遍历(遍历指向该结点的所有结点)

*/

 

二、孩子表示法(顺序+链式存储)

//孩子表示法

//将每个结点都放在一个链表里

struct CTNode{

int child;//孩子结点在数组中的位置

struct CTNode *next;//下一个孩子

};

typedef struct{

int data;

struct CTNode *firstChild;//第一个孩子

}CTBox;

typedef struct{

CTBox nodes[MAX_TREE_SIZE];

int n,r;//结点数和根的位置

}CTree;

 

三、孩子兄弟表示法(链式存储)

 //孩子兄弟表示法(链式存储) 
typedef struct CSNode{
    int data;
    struct CSNode *firstchild,*nextsibling;//二叉链表表示第一个孩子和右兄弟指针 
}CSNode,*CSTree;

四、二叉树转换为树

 

 

五、森林和二叉树的转换

森林是m(m>0)棵互不相交的树的集合

先全部转换成二叉树

最后把根结点用右指针连起来

 

森林转换成树

 

六、小结

 

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值