中序遍历就一个核心思路:对于节点来说,如果没有左孩子,左指针就存入前驱节点,如果没有右孩子,右指针就存入后继节点
初始化
节点结构:数据域+指针域(左指针,右指针)+标志(左,右)
表头结构:头指针+计数器
创建节点结构:将节点中所有的属性都初始化,注意接口设计的时候要传入元素值,在创建节点结构的时候,
创建头结构:
1.为头申请空间
2.memset初始化
3.判断是否已经有表头
元素的插入
中序线索化过程
考虑到left会指向前驱节点,那么定义一个pre指针存储进入这个节点之前的状态
使用中序遍历,当回到访问节点时,判断这个节点是否有左孩子,如果没有,当前阶段的left就可以保存pre的值
如果代码不理解可以看看下面的视频:
【线索二叉树[第二部分:代码讲解]-哔哩哔哩】 https://b23.tv/g1JBwvm
1.创建前驱节点,让他为空
2.一个节点进去之后,先处理它的左孩子
3.如果左孩子为空,让左边的标志为1,并且左指针指向前驱节点pre
4.为什么这里判断的是pre呢,因为右节点指向的应该是后继节点,那当前的节点node就是pre的后继节点
5.让pre到当前节点
6.处理完左边后再处理右边
中序线索化后,遍历二叉树
1.先找到第一个元素,有了头才能往下找
2.通过第一个元素访问后继节点