目录
1. 树和森林的关系
树和森林之间是可以相互转换的:将树的根节点去掉,就成了森林;给森林加上一个共有的根节点,就成了树。
2. 树的存储结构
双亲表示法
特点: 找parent结点简单,找child难
适用场景:经常需要找某结点的parent结点的情况
函数定义
第一框为定义结点,第二框为定义树结构。
孩子链表
特点: 找child容易,找parent难
适用场景:经常需要找某结点的child结点的情况
函数定义
由简至繁:第一框是最低等级,为上图中的最右边记录数字与next的链表结点;
第二框是数组中每个单独的结点,为上图中A~K的结点(此时不要竖着看,仍然要横着看,到此还没有建立起竖着的关系,这就是在定义每一横行的头指针)
第三框才是树结构,定义一个数组,建立起了头指针之间的联系。此时头指针才有编号。
改进方法
再增加一个位置存储parent位置,增大了便利性,但牺牲了空间
二叉树/二叉链表表示法(最常用)
特点:找child容易,找parent难
适用场景:经常需要找某结点的child结点的情况
函数定义
与二叉链表的节点定义非常相似,每个节点由 一个数据域 + 两个指针域 构成。
例
作者的疑问
1. 为什么每层中最后一个结点的兄弟指针不指向该层的第一个结点,实现闭环?例如:要找B的所有兄弟结点,只能由B到C而无法找到A
2. 在索引二叉树章节中,学会了利用悬空指针域的方法。增加一个存储0/1的空间占用空间极少,为什么在此情况不利用起来,比如在悬空的状态下,更改tag,指向parent结点,却放任指针域悬空而限制操作数量?