目录
下一篇: 树和森林的遍历
一、双亲表示法(顺序存储)
实现:
#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)棵互不相交的树的集合
先全部转换成二叉树
最后把根结点用右指针连起来
森林转换成树
六、小结