森林
m(m≥0)棵互不相交的树的集合
树的存储结构
双亲表示法:使用结构数组实现,包含两个域->数据域和双亲域(双亲结点在数组中的位置;根的双亲结点位置表示为-1)
R | A | B | C | D | E | F | G | H | K |
-1 | 0 | 0 | 0 | 1 | 1 | 3 | 6 | 6 | 6 |
特点:找双亲容易,找孩子难
孩子链表:将每个结点的孩子用单链表存储(n个结点有n个单链表,叶子结点是空表),再将所有单链表的头指针组成数组存储(上图链表表示如下)
孩子兄弟表示法(二叉链表表示法)
每个结点由两个指针域分别指向第一个孩子结点和下一个兄弟结点
树和二叉树的转换
使用二叉链表作为媒介可以导出树和二叉树之间的对应关系
树->二叉树
1.加线:在兄弟之间加连线
2.抹线:对每个结点,除左孩子外,去除其他孩子之间的关系
3.旋转:以根为轴心,将树顺时针转45°
二叉树->树
1.加线:若p结点为双亲结点的左孩子,则将p的右孩子,右孩子的右孩子...沿分支找到的所有右孩子都和p的双亲连线
2.抹线:抹掉原二叉树双亲结点和右孩子的连线
3.调整:按层重新排列
森林与二叉树之间的转换
森林->二叉树
1.将每棵树分别转换为二叉树
2.将每棵树的根结点用线相连
3.以第一颗树的根为二叉树的根进行顺时针旋转
二叉树->森林
1.抹线:将二叉树中根结点与其右孩子连线,及沿右分支搜索到的所有右孩子之间的连线全部抹掉,使之成为孤立二叉树
2.还原:将孤立二叉树全部还原成树
树的遍历
先根遍历:先访问根结点,再依次遍历子树
后根遍历:先一次后根遍历各子树,然后访问根结点
层次遍历:从上到下从左到右依次访问
森林的遍历
从左到右对森林中的每一颗树进行先根遍历/后根遍历