中序线索化--代码实现、一边遍历,一边线索化
注意:1.非空二叉树才能线索化
2.无论是先序,中序,后序 都要在最后 处理最后一个节点,rchild=null,rtag = 0
为什么线索化?答:为了找前驱和后继
全部的代码实现
先序线索化--代码实现
注意:在遍历的时候,会有一个问题,你在线索化后,你的D节点 线索指向前驱的时候,然后,去看G,G线索没有问题,当你回到B时发现,B的左子树依然有 子树,就会去线索化B,B已经线索化过了,就会一直转圈圈。
解决方案:在遍历时加上ltag 的条件,ltag =0 就是已经线索化过了,可以不用去线索化了
后序线索化--代码实现
中序线索二叉树找中序后继
找中序后继-- 一定有右子树,如果右子树,是最后一个节点,就直接找后继就行,如果不是最后一个节点,需要找到右子树的 最左下节点。
p->rtag ==1 ,就是没有右子树了,线索化了,可以使用next = p->rchild 直接找到后继
p->rtag ==0,就是有右子树,你需要找到右子树的 最左下节点,然后返回后继线索
中序线索二叉树找 中序前驱
找中序前驱--一定有左子树,如果左子树,是最后一个节点,就直接找前驱就行,如果不是最后一个节点,需要找到左子树的 最右下节点。
先序线索二叉树找 先序后继
先序线索二叉树 找 先序前驱
因为 你是用的二叉链表 根左右 ,你找到不到 先序前驱,除非用土办法从头开始先序遍历,还有一种就是 三叉链表,有个指针指向父节点
用三叉链表找 先序前驱,有四种情况
后序线索二叉树找后序前驱
后序线索二叉树 找后序节点,和( 用三叉链表找 先序前驱)相似
总结