树与森林的存储、遍历和树与森林的转换
树的存储结构
双亲表示法
孩子表示法:
(a)多重链表(链表中每个指针指向一棵子树的根结点);
(b)把每个跟结点的孩子结点排列起来,看成一个线性表,且以单链表做存储结构.且N个头指针也组成一个线性表.
孩子兄弟表示法://二叉树表示法或二叉链表表示法
以二叉链表做树的存储结构,链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点(fchild 和nsibling)
//孩子兄弟表示法 typedef struct CSNode{ int data; CSNode *fchild ,*nsibling; } CSNode, *CSTree;
二叉树和树都可用二叉链表作存储结构,则以二叉链表作为媒介可导出树与二叉树之间的一一对应关系。
森林和二叉树的转换
由树的二叉链表表示定义知道:任何一棵和树对应的二叉树的右子树必空。若将森林中第二棵树的根结点看成第一棵树的根结点的兄弟,如此重复……则可以导出森林和二叉树的对应关系。
树和二叉树的转换
使用孩子兄弟表示法来转换,土办法:可以把有同一个双亲结点的各个孩子结点有虚线串起来,把每层的每个结点分支从左到右除去第一个外,其余都剪掉,则剩余的图(包括虚线)就是二叉树。详细过程如下:
只有两种,森林得失先序和中序,树的是先跟和后跟
树的遍历
先访问根结点,
然后依次先根遍历根的每棵子树。
先根遍历序列,对应二叉树先序遍历
后根访问根的每棵子树,
然后访问根结点。
后根遍历序列,对应二叉树的中序遍历
森林的遍历:
先序
1.访问森林中第一棵树的根结点;
2.先序遍历第一棵树中根结点的子树森林;
3.先序遍历除去第一棵树之后剩余的树构成的森林.
先序遍历序列
中序
1.中序遍历第一棵树中根结点的子树森林;
2.访问森林中第一棵树的根结点;
3.中序遍历除去第一棵树之后剩余的树构成的森林.
中序遍历序列
欢迎关注
dashuai的博客是终身学习践行者,大厂程序员,且专注于工作经验、学习笔记的分享和日常吐槽,包括但不限于互联网行业,附带分享一些PDF电子书,资料,帮忙内推,欢迎拍砖!