在听尚硅谷韩顺平老师课程的时候这个地方没有理解,先把java中序线索化二叉树代码附上:

private HeroNode pre = null;//在递归线索化,pre总是保留前一个结点
/**** @param node 就是当前需要线索化的结点*/
public void threadedNodes(HeroNode node){//如果node == null,不能线索化if(node == null){return;}//(一)先线索化左子树threadedNodes(node.getLeft());//(二)线索化当前结点[有难度]//处理当前结点的前驱结点//以8结点来理解//8结点.left = null,8结点的Lefttype = 1if(node.getLeft() == null){//让当前结点的左指针指向前驱结点node.setLeft(pre);//修改当前结点的左指针的类型,指向前驱结点node.setLeftType(1);}//处理后继节点if(pre != null && pre.getRight() == null){//让前驱结点的右指针指向当前结点pre.setRight(node);//修改前驱结点的右指针类型pre.setRightType(1);}//!!!每处理一个结点后,让当前结点是下一个结点的前驱结点pre = node;//(三)再线索化右子树threadedNodes(node.getRight());
}

个人理解:上面的(一)(三)就是在递归,分别进去左子结点、右子结点,这个好理解。

重点是在第(二)个步骤,即线索化当前结点。

那为什么设置前驱结点的时候,直接node.setLeft(pre),而设置后驱结点的时候,不能直接node.setRight(……)呢?

自己解释: 因为是中序线索化,即先进入左子树,再进行当前结点,再进入右子树,即考虑当前结点的时候左子树已经走过了,这个时候我更改左子树结点不影响后面的进行,即可以直接设node.setleft;但是这个时候还没有进入右子树,我如果直接设置了node.setright(比如下图中10的后继节点是1),那么后面进入右子树递归的时候就进入了刚刚设置的结点(即下图中的1结点,那么后面又重新进入3 8 10 1……),这样递归就成为了死循环。

图1 来自韩顺平老师课件

所以我们设置该结点的后继结点的时候不能在这一次递归中直接设置,而是通过pre记下当前结点,等我把右子树走过之后,再通过pre.setright来设置后继结点,这个时候因为node已经走到下一个递归里了,更改pre的后继节点已经不会造成影响。

如果大家想看一下递归是具体怎么走的,可以移步另一个陈平老师的视频(大约从第18分钟开始),不过个人认为就递归本质而言,他们只讲了这样做可以,而没讲为什么直接对当前结点设置setright不行,还是我上面理解的透彻一点哈哈。

图2 来自陈平老师课件

数据结构2:中序线索化二叉树为什么要通过pre设置后继结点相关推荐

  1. node 获取表单数据 为空_程序员:数据结构和算法,中序线索化二叉树

    1.中序线索化二叉树   创建如上的二叉树,线索化二叉树时,根据指定的遍历方式得到的节点的访问顺序,一个节点前面的节点,叫做前驱节点,一个节点后面的节点,叫做后继节点.   线索化二叉树的规则:   ...

  2. 数据结构: 试用判定树的方法给出在中序线索化二叉树上: (1) 如何搜索指定结点的在中序下的后继。 (2) 如何搜索指定结点的在前序下的后继。(3) 如何搜索指定结点的在后序下的后继。

    题目 试用判定树的方法给出在中序线索化二叉树上: (1) 如何搜索指定结点的在中序下的后继. (2) 如何搜索指定结点的在前序下的后继. (3) 如何搜索指定结点的在后序下的后继. 分析 这是殷人昆& ...

  3. 中序线索化二叉树c语言实现

    ```c #include<stdio.h>//首先定义一个遍历前驱的节点ThreadNode *pre = NULL;//指向前驱节点typedef struct ThreadNode ...

  4. Java:中序线索化二叉树及遍历

    class Threade{BinaryTree root;//记录根节点,用于遍历BinaryTree pre;//pre指针,用于线索化,表示上一个节点Threade(BinaryTree nod ...

  5. Java实现前中后序线索化二叉树以及遍历

    文章目录 一.线索化二叉树的原理 二.构建线索化二叉树 三.代码实现线索二叉树 一.线索化二叉树的原理 在前面介绍二叉树的文章中提到,二叉树可以使用两种存储结构:顺序存储和链式存储,在使用链式存储时, ...

  6. 后序线索化二叉树及遍历(图解)

    上一篇博客对于 二叉树线索化以及线索化的先序.中序.后序遍历做了比较详细的描述 写在前面 其实,我还是很想把本篇博客和二叉树的线索化写在一块的,但是考虑到可能这博客的内容就看足以超过了上一篇的篇幅,考 ...

  7. 线索化二叉树,中序建立线索,带线索中序遍历,删除,c/c++描述

      二叉树的叶节点的两个指针都没有利用,一些分支节点也可能有一个指针指向NULL,这些指针造成了程序在内存空间上的浪费,但这些叶节点也必不可省.所以我们可以把这些指向NULL的指针,重新赋值,左指针则 ...

  8. C语言实现线索化二叉树(先序、中序、后序)

    >>如何用C语言构建一颗二叉树? 第一种方法: ThreadTree A = (ThreadTree)malloc(sizeof(ThreadNode));A->data = { ' ...

  9. 【算法系列之线索化二叉树,前序线索化、中序线索化、后序线索化以及遍历~】

    1.何谓线索化二叉树 2.线索化二叉树的本质 3.线索化二叉树的存储结构 4.构建线索化二叉树 4.1.先序线索化 4.2.中序线索化 4.3.后序线索化 5.遍历线索化二叉树 5.1.先序遍历 先序 ...

最新文章

  1. CSS盒模型及边距问题
  2. R语言:使用REmap绘制超炫酷的地图
  3. 枚举目录下的目录和文件CFileFind
  4. PL/SQL学习笔记(四)
  5. Warning: Link to vtkInteractionStyle for default style selection的解决办法
  6. switch与if效率实例解析·5年以下编程经验必看【C#】
  7. Android 应用 之路 天气预报(五)
  8. 2010年过年左右时的艾米果
  9. Android音视频开发
  10. Docker学习: 配置Docker阿里云的镜像加速器(图文)
  11. java获取序列号_纯Java获取CPU序列号
  12. 练习时长一年半,算法蒟蒻的成长记录
  13. word与mathtype——“运行时错误48,文件未找到:MathPage.wll”解决
  14. 百度地图标记点中添加echarts图表
  15. make: *** No targets specified and no makefile found. Stop.错误解决办法
  16. 数据治理和数据安全治理有何不同?
  17. 大型网站架构演进历程
  18. Linux下__attribute__((aligned(n)))的使用
  19. 【第十七届智能车】智能车图像处理(2)-赛道边界的简单提取和无元素循迹
  20. win10 增加eng语言

热门文章

  1. verilog中的三目运算符
  2. C++实现大数的加法
  3. 【思维导图-索引篇】搞定数据库索引就是这么简单
  4. SVN客户端不显示绿色标识
  5. 别再抱怨了,国内这么多优秀的Android资源你都知道吗?
  6. C# SQLite数据库 访问封装类
  7. PHP跳转到另一个画面,并且带着该行内的一个数值作为参数传递给下一个页面.能给例子吗...
  8. 使用python写Wave文件
  9. Jsp实现网上彩票销售系统
  10. Bert 中文使用方式