严蔚敏视频 笔记22
6.4 树和森林的表示方法
树的三种存储结构
一、双亲表示法
#define MAX_TREE_SIZE 100
// 结点结构
typedef struct PTNode {
Elem data;
int parent; // 双亲位置域
} PTNode;
// 树结构
typedef struct {
PTNode nodes[MAX_TREE_SIZE];
int r,n; // 根结点的位置和结点个数
} PTree;
用顺序表来表示
二、孩子链表表示法
// 孩子结点结构
typedef struct CTNode {
int child;
struct CTNode *next;
} *ChildPtr;
// 双亲结点结构
typedef struct {
Elem data;
ChildPtr firstchild; // 孩子链的头指针
} CTBox;
// 树结构
typedef struct {
CTBox nodes[MAX_TREE_SIZE];
int n,r; // 结点数和根结点的位置
} CTree;
三、树的二叉链表(孩子-兄弟)存储表示法
typedef struct CSNode {
Elem data;
struct CSNode *firstchild,*nextsibling;
} CSNode,*CSTree;
非常类似二叉树的存储结构
将树的操作转换到二叉树的操作
森林和二叉树的对应关系
设森林F=(T1,T2,…Tn);
T1=(root,t11,t12,…t1m);
二叉树B=(LBT,Node(root),RBT);
森林到二叉树的转换规则:
若F=φ则B=φ;
否则:
由ROOT(T1)对应得到Node(root)
由(t11,t12,…t1m)对应得到LBT
由(T2,T3,…Tn)对应得到RBT
二叉树到森林的转换规则:
若B=φ则F=φ;
否则:
由Node(root)对应得到ROOT(T1)
由LBT对应得到(t11,t12,…t1m)
由RBT对应得到(T2,T3,…Tn)
和树对应的二叉树其左右子树的概念变为:左孩子右兄弟
6.7 树和森林的遍历
树的三条搜索路径:
先根遍历
后根遍历
按层次遍历
森林的遍历
先序遍历(依次从左到右对森林中的每一棵树进行先根遍历)
若森林不空则
访问森林中第一棵树的根结点
先序遍历森林中第一棵树的子树森林
先序遍历森林中(除第一棵树外)其余树构成的森林
中序遍历(依次从左到右对森林中的每一棵树进行后根遍历)
若森林不空则
中序遍历森林中第一棵树的子树森林
访问森林中第一棵树的根结点
中序遍历森林中(除第一棵树外)其余树构成的森林
森林的先序遍历对应二叉树的先序遍历
森林的中序遍历对应二叉树的中序遍历
树的遍历算法的应用
一、求树的深度的算法
int TreeDepth(CSTree T) {
if(!T) return 0;
else {
h1=TreeDepth(T->firstchild);
h2=TreeDepth(T->nextsibling);
return(max(h1+1,h2));
}
}