最近期末了,就整理一下二叉树吧 ~ 希望能帮到大家
-
双亲表示法(适用于找双亲)
结构性数组:用数组保存结点,结点里又包含数据和双亲下标
#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度。
以上就是树的存储结构,如有错误,敬请指正,谢谢大家!