树的存储
1、二叉树的存储
连续存储(以完全二叉树形式存储)
因为内存是连续的,而树本身是一个非连续的形式,所以如果一颗二叉树想要以数组形式存储时必须转化为完全二叉树形式存储。
例子:
图中这个二叉树想要存储就必须先化成满二叉树
蓝色的都为垃圾节点,然后再删除右侧垃圾节点,使满二叉树变成完全二叉树
- 优点:查找某个节点的父节点和子节点(也包括判断有没有子节点)的速度很快
- 缺点:耗用内存空间过大
链式存储
耗用内存较少
2、一般树的存储
双亲表示法(方便求父节点)
如图所示,一般树可在内存中用数组存储,那为什么二叉树的连续存储不可以用这种方法呢?因为二叉树是有序的,一般树是无序的,而这种表示方法是无序的。
孩子表示法(方便求子节点)
子节点不能用下标表示,因为子节点可能有多个,所以用链表表示
双亲孩子表示法(求父节点子节点都方便)
二叉树表示法(方便操作)
把普通树转换成二叉树来存储
具体转换方法:
- 保证任意一个节点的左指针域指向第一个孩子
- 右指针域指向他的兄弟节点
例子:对该一般树进行转化:
转化结果为:
可以看出一个一般树转化为二叉树一定没有右子树
3、森林的存储
不直接存储森林,而是先把森林转化成一个二叉树,然后对二叉树进行存储
转换方式:
- 将几棵树的根节点当作兄弟(即可想做造一个根节点,将森林变成一般树)
- 根据一般树转二叉树的原理进行转化
例子: