双亲表示法:(多用与寻找parent,寻找child较为困难)
树的双亲表示法采用一组连续的存储空间来存储每个节点。根节点没有双亲,所以其在数组中存储的值为-1。其余的节点,只需要存储其父节点对应的数组下标即可。
#define MAX_TREE_SIZE 100
typedef struct {
ElemType data;
int parent;
} PTNode;
typedef struct {
PTNode nodes[MAX_TREE_SIZE];
int n;
} PTree;
孩子表示法:(多用于寻找child,找parent较为困难)
孩子表示法存储普通树采用的是"顺序表+链表"的组合结构,其存储过程是:从树的根节点开始,使用顺序表依次存储树中各个节点。需要注意,与双亲表示法不同的是,孩子表示法会给各个节点配备链表指针,来存储节点的所有子节点
#define MAX_TREE_SIZE 100
typedef struct CTNode {
int child;
struct CTNode *next;
} *ChildPtr;
typedef struct {
ElemType data;
ChildPtr firstchild;
} CTBox;
typedef struct {
CTBox nodes[MAX_TREE_SIZE];
int n;
} CTtree;
带双亲的孩子链表:
双亲-孩子链表是一种将双亲表示法和孩子表示法结合起来的存储方式。每个节点既存储与它直接相关的双亲节点信息,又存储它的所有子节点信息。
#define MAX_TREE_SIZE 100
typedef struct CTNode *ChildPtr;
typedef struct {
ElemType data;
int parent;
ChildPtr firstchild;
} CTBox;
typedef struct {
CTBox nodes[MAX_TREE_SIZE];
int n;
} PCTree;
孩子兄弟表示法:
struct tree_node {
int value;
struct tree_node *first_child; // 左孩子节点指针
struct tree_node *next_sibling; // 右兄弟节点指针
};
树和森林相互转换:
树-->>二叉树
二叉树用左右孩子法存储
树用孩子兄弟表示法存储
他们的存储一样,不同解读有不同的树,可先将树按存储来转换
口诀:兄弟之间加上线,双亲之间去掉线
二叉树-->>转树同理
树的遍历分为:先根,后跟,层次
二叉树的遍历分为:先序,中序,后序,层次
森林的遍历:
1)先序遍历森林
- 访问森林中第一棵树的根节点
- 先序遍历第一棵树的根节点的子树森林
- 先序遍历除去第一棵树之后剩余的树构成的森林