线索化二叉树

X8-3、java数据结构---线索化二叉树【2021-1-2】 - 简书 (jianshu.com)

这个是别人的线索化二叉树笔记

 怎么调试

IDEA 断点调试 debug 会用吗?#69_哔哩哔哩_bilibili

这个是图

原二叉树 中序遍历的结果

 

 

线索化的代码

怎么去理解这个代码 方法就是去调试  idea会显示出每一步跳到哪个代码了

第一 先在这里打断点

调试之后得到的结果

可以知道 经过了 

 

这一步后 结点就从root(1) 遍历到了8号结点 

此时再向下运行 (会指向if语句里面的条件)

就会跳到这里 说明8结点的getletf返回的是null 

这里显示了 

所以会执行if语句

点击下一步的结果

per还是默认值null

 所以8号结点的左指针指向的是null(为什么? 因为8号结点是中序遍历的第一个结点 如果没有左字节点 那么左指针需要指向前驱结点 就是谁比8先被遍历到 自然是没有 所以8的左指针指向null)

然后再向下执行

到了这一步

 

 结果就是8号结点的LeftType的值改变了

此时的值

 再点击下一步 

进入到了这里

 此时的值

说明此时的per是null  

不满足if里面的条件

就会跳过if 直接进入这句

 此时的per就是指向8号结点了

结果

 

再点击下一步

 就会递归线索化右子树 

这一步

 

经过这个步骤后  node就会变成null  (在执行这一步之前 node指向的是8  那么node.getright就是null   所以node.getRight()当成参数传进去 所以node就变成了null) 说明

执行到了这里

 

 再点击下一步就直接退出方法了 因为node==null

然后再下一步就到了这里  (中间是经历了一个过程 先退出方法 再进来的过程)

因为在main方法里面 只调用了ThreadNode方法一次 所以这个方法是不断递归然后完成了线索化

 

 此时的值(这个node变成这个值是因为先经历了这一步)

左递归 

 

思考 为什么结点8经历了左递归 本身线索化 右递归  就突然node变成3结点了 

答:因为3结点是8的父节点   由于递归    3结点进入左递归的时候 就代表8进入了递归  8结束了全部递归后 就代表3结束了左递归 接下来应该指向自己线索化的过程了(中序)  所以此时的node变成了3

而且这也就是为什么当我点击下一步的时候 没有经过3结点的左递归 因为3结点的左递归就是8结点的全递归 已经经历过了  所以直接跳过

所以当跳到这一步的时候 再哇往下继续运行

 就会进入if语句的条件判断 

跳到这里了

此时的left是8号 

 

所以不为空 

说明3号结点的左指针不需要线索化 就跳出if

再点击下一步就进入了这里

此时的值

 

 

说明满足if语句里面的条件

if里面的语句的作用是啥 其实就是修改前继结点的值 

比如此时的per是8(因为之前在经历node8的递归的时候 有代码per=node 所以在执行if语句之前 per就指向了8结点)

当执行完了if之后  

 最后的值

 似乎没变 只是per的RIghtType的值变成了1 

问题 这一段代码为什么要这么写

因为per是前继结点  根据线索化二叉树的定义  正是因为是前继结点 那么node就是per的后继结点

要让前继结点指向后继结点 那么就应该让其右指针指向 所以是使用setRight()方法

然后一切都处理完了

就指向下一步

 代码执行完了的语句

 再向下执行就是这段代码了

 执行完了3的右递归后的值

 

为什么node变成了10 因为右递归的参数是node.getRight 就是结点10

到了这里 

 因为当然不满足if 所以点击下一步 就进入到了这里

 值还是这些 (还没开始执行结点10的左递归)

 再下一步执行 就进入了新的递归(结点10的左递归) 就进入到了这里

 当一直点击下一步就执行完了第一个if语句

此时的值 

还是没变  但是结点10的左指针还有LeftType变化了  因为10是叶子结点 根本没有左结点 所以说结点10的右指针需要线索化 指向前驱结点

 

 

然后再向下执行 就变成了这样

 此时的值 (注意因为不满足if语句 所以说直接跳出了 因为per的右指针有指向 所以不需要再线索化)

其实per的设置就是为了设置结点的右指针线索化 前面的一个if只是左指针的线索化

 再点击执行下一步就变成了这样(是先执行完了per=node 才跳转到53行)

 此时的值

然后再下一步就会进入结点10的右递归

 因为结点10的右子树为空 所以node的值变成了null 

然后经过这行代码就会直接退出右循环

 

退出了右递归后 就会进入到这里

 此时的值

 

 注意 此时的根节点1的左递归已经完全结束  所以在经历了结点10的右循环后 会直接跳转到第一个if语句 因为前面所有的操作都是在结点1的左递归里面执行 

然后再继续向下执行  第一个if语句是不会执行的 因为结点1的左指针是有指向的 

但是会执行第二个if语句  因为per此时是结点10 结点10的右指针还没有线索化 所以会执行

 

执行了第二个if之后的情况

值: 没有变化 因为只是修改了结点10的参数

 

 然后就是进入了结点1的右递归 和左递归一个情况 就不细讲了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值