1、中序线索化二叉树


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

线索化二叉树的规则:

  按照某一遍历规则。记录当前节点(cur)上次访问的节点(pre)
   如果当前节点的左孩子为空 (cur.leftNode == null),就让当前节点的左指针指向它的前驱节点 ,并把当前节点左指针的模式修改为线索类型 (cur.leftNode = pre ,cur.leftType = 1)
   如果当前节点的前驱节点的右孩子为空 (pre.rightNode == null),就让当前节点的前驱节点的右指针指向当前节点,并把前驱节点的右指针修改为线索类型 (pre.rightNode = cur ,pre.rightType = 1)。

代码实现:

/*** 线索二叉树节点*/
public class ThreadedNode {//节点的权int value;//节点的左右孩子节点ThreadedNode leftNode;ThreadedNode rightNode;//表示指针的类型int leftType;int rightType;//设置节点的权值public ThreadedNode(int value) {this.value = value;}//设置节点的左右孩子节点public void setLeftNode(ThreadedNode leftNode) {this.leftNode = leftNode;}public void setRightNode(ThreadedNode rightNode) {this.rightNode = rightNode;}//获取节点的左右孩子节点public ThreadedNode getLeftNode() {return this.leftNode;}public ThreadedNode getRightNode() {return this.rightNode;}public void midShow() {//先遍历左子树if (this.leftNode != null){leftNode.midShow();}//打印当前节点的权值System.out.println(this.value);if (this.rightNode != null){rightNode.midShow();}}
}
/*** 线索二叉树*/
public class ThreadedBinaryTree {//树的根节点ThreadedNode rootNode;//用于临时存储前驱节点ThreadedNode pre = null;//设置二叉树的根节点public void setRootNode(ThreadedNode rootNode) {this.rootNode = rootNode;}//获取二叉树的根节点public ThreadedNode getRootNode() {return this.rootNode;}//中序线索化二叉树public void threadNode() {threadNodes(rootNode);}private void threadNodes(ThreadedNode node) {//当前节点为空,直接返回if (node == null) {return;}//处理左子树threadNodes(node.leftNode);//处理前驱节点if (pre != null && node.leftNode == null) {//当前节点的左指针指向前驱节点node.leftNode = pre;//修改节点为线索模式node.leftType = 1;}//处理前驱节点的右指针if (pre != null && pre.rightNode == null) {pre.rightNode = node;pre.rightType = 1;}//当前节点就是下一个节点的前驱节点pre = node;//处理右子树threadNodes(node.rightNode);}//中序遍历二叉树public void midShow() {if (this.rootNode == null) {return;} else {rootNode.midShow();}}
}/*** 测试类*/
public class TestThreadedBinaryTree {public static void main(String[] args) {//1、创建二叉树ThreadedBinaryTree binaryTree = new ThreadedBinaryTree();ThreadedNode rootNode = new ThreadedNode(1);binaryTree.setRootNode(rootNode);ThreadedNode leftNode = new ThreadedNode(2);ThreadedNode rightNode = new ThreadedNode(3);rootNode.setLeftNode(leftNode);rootNode.setRightNode(rightNode);leftNode.setLeftNode(new ThreadedNode(4));ThreadedNode five = new ThreadedNode(5);leftNode.setRightNode(five);rightNode.setLeftNode(new ThreadedNode(6));rightNode.setRightNode(new ThreadedNode(7));//2、中序遍历二叉树System.out.println("中序遍历结果:");binaryTree.midShow();System.out.println("------------------------");binaryTree.threadNode();ThreadedNode beforeNode = five.leftNode;System.out.println("节点5的前驱节点:"+beforeNode.value);ThreadedNode afterNode = five.rightNode;System.out.println("节点5的后继节点:"+afterNode.value);}
}

数据结构和算法——中序线索化二叉树相关推荐

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

    在听尚硅谷韩顺平老师课程的时候这个地方没有理解,先把java中序线索化二叉树代码附上: private HeroNode pre = null;//在递归线索化,pre总是保留前一个结点 /**** ...

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

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

  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. 【算法系列之线索化二叉树,前序线索化、中序线索化、后序线索化以及遍历~】

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. c# tcp显示服务器图片,C# TCP通迅原码(服务器与客户端相互发送文本与图片)
  2. SAP MM Overall Level 审批的采购申请中行项目里的成本中心必须是同一个!
  3. vant 项目_如何搭建mpvue框架搭配vant组件库的小程序项目
  4. 从ICLR 2022看什么是好的图神经网络?
  5. python django mysql写入中文乱码_Django 连接mysql数据库中文乱码
  6. Java程序莫名其妙卡死的一次经历
  7. (转载)grep 行号正则匹配字符有颜色
  8. 从volume表的host字段开始学习RPC
  9. (原创)无废话C#设计模式之十七:Chain Of Resp.
  10. fgetc和fputc函数
  11. 数学系之必备参考书+数学系教材推荐
  12. html5透明图片格式,半透明图片制作
  13. 计算机控制电子点火系控制电路分析,点火示波器的工作原理 用示波器诊断点火系故障方法...
  14. 网店营销忌讳效应:要知道别人不喜欢什么
  15. 如何选择适合你的兴趣爱好(七十一),养鸟
  16. PTA创建视图,包含商品打折前后的价格信息
  17. Qiyuan-python接小球游戏2.0
  18. OKRs, How Google sets goals, Startup Lab workshop | Chatopera
  19. 梯度下降与反向传播算法的原理与推导
  20. 实战PyQt5: 050-选项卡控件QTabWidget

热门文章

  1. 二、三层交换机与路由器
  2. 20145302张薇《Java程序设计》第三周学习总结
  3. C语言之选择结构与循环结构
  4. UVA 10246 Asterix and Obelix
  5. 【收藏】Windows 8 Consumer Preview的108个运行命令及简要说明
  6. Postgresql安装配置win版本
  7. auto_ptr 源码 极其解析
  8. python中out函数_cython函数输出与python函数outpu略有不同
  9. 拓端tecdat|python虎扑社区论坛数据爬虫分析报告
  10. java表示非法参数的异常是_JAVA 的异常那些事