第四章:树与二叉树(树和森林的相关知识)
1.存储方式
1.1双亲表示法
双亲表示法:采用一组连续的存储空间来存储每个结点,同时在每个节点中增设一个伪指针,指示双亲结点在数组中的位置。根结点的下标为0,其伪指针域为-1
代码实现:
//每一个结点,数据 data 和标识双亲结点的下标的 parent#define MAX_TREE_SIZE 100typedef struct{ ElemType data; int parent;}PTNode;//二叉树结构体typedef struct{ PTNode nodes[MAX_TREE_SIZE]; //所有的结点信息 int n; //该树结点的个数}PTree;
将上述二叉树使用双亲表示法存储:
根结点R没有双亲结点所以parent存储值为-1,其中A结点为根结点故parent值为0,其中D和E的双亲结点为A,故其parent存储双亲结点的下标为1,以此类推
1.2孩子表示法
孩子表示法:将每个结点的孩子结点都用单链表连接起来形成一个线性结构,n个结点具有n个孩子链表。
//每一个孩子结点的结构体#define MAX_TREE_SIZE 100typedef struct{ int child; //孩子结点的下标 struct *CNode *next; //下一个孩子结点的指针}CNode;//每一个结点存放的数据元素以及第一个孩子结点的指针typedef struct{ ElemType data; struct CNode *child;}PNode;//整棵二叉树typedef struct{ PNode nodes[MAX_TREE_SIZE];//所有的结点信息 int n; //该树结点的个数}CTree;
将上述二叉树使用孩子表示法存储:
相当于将每一个结点和其孩子结点构成一个链表,其中R有孩子结点A B C 下标分别为 1 2 3,所以构成的链表的child值存储其下标,A结点有孩子结点D E,下标为4 5,故构成的链表的child值存储其下标,依次类推
1.3孩子兄弟表示法
孩子兄弟表示法:以二叉链表作为树的存储结构,又称二叉树表示法。
我们知道二叉链表仅仅多了两个指针,那么如何如何存放这么多的孩子节点呢?结构设计如下:
因此此方法又称为 左孩子右兄弟
typedef struct CSNode{ ElemType data; struc