中序线索二叉树

  • 线索二叉树概述
  • 线索二叉树代码实现
    • 线索二叉树的数据结构
    • 线索二叉树的遍历
  • 线索二叉树示例完整代码
    • 线索二叉树类 ThreadedBinaryTree
    • 线索二叉树节点类 ThreadedNode
    • 测试类 TestThreadBinaryTree

线索二叉树概述

线索化二叉树时,
一个节点的前一个节点,叫做前驱节点
一个节点的后一个节点,叫做后继节点

线索二叉树是建立在二叉树的基础上,可以方便的表示某个节点的前驱节点和后继节点。

每个节点的左右指针设置标签,来表示该指针是指向前驱、后继,还是指向左儿子、右儿子

如果标签值为 0,则表示该指针指向左、右儿子;
如果标签值为 1,则表示该指针指向前驱、后继。

线索二叉树代码实现

线索二叉树的数据结构

public class ThreadedBinaryTree {ThreadedNode root; // 根节点ThreadedNode pre = null; // 用于存储临时节点// 中序线索化二叉树public void threadNodes(){threadNodes(root);}public void threadNodes(ThreadedNode node){if (node == null)return;threadNodes(node.leftNode); // 处理左子树// 处理当前节点if (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 setRoot(ThreadedNode root) { // 设置根节点this.root = root;}public ThreadedNode getRoot() { // 获取根节点return root;}
}
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 void midShow() {// 左if (leftNode != null){leftNode.midShow();}// 根System.out.print(value + " ");// 右if (rightNode != null){rightNode.midShow();}}}

线索二叉树的遍历

// 遍历线索二叉树
public void threadIterate(){ThreadedNode node = root;    // 用于临时存储当前遍历节点while (node != null){while (node.leftType == 0){  // 循环找到最开始的节点node = node.leftNode;}System.out.print(node.value + " ");  // 打印当前节点的值while (node.rightType == 1){  // 如果当前节点的右指针指向的是后继节点,可能后继节点还有后继节点node = node.rightNode;System.out.print(node.value + " ");}node = node.rightNode;  // 替换遍历的节点}
}

线索二叉树示例完整代码


创建如图所示的二叉树,并将它中序线索化,然后对它进行遍历。

线索二叉树类 ThreadedBinaryTree

public class ThreadedBinaryTree {ThreadedNode root;// 用于临时存储前驱节点ThreadedNode pre = null;// 遍历线索二叉树public void threadIterate(){ThreadedNode node = root;    // 用于临时存储当前遍历节点while (node != null){while (node.leftType == 0){  // 循环找到最开始的节点node = node.leftNode;}System.out.print(node.value + " ");  // 打印当前节点的值while (node.rightType == 1){  // 如果当前节点的右指针指向的是后继节点,可能后继节点还有后继节点node = node.rightNode;System.out.print(node.value + " ");}node = node.rightNode;  // 替换遍历的节点}}// 设置根节点public void setRoot(ThreadedNode root) {this.root = root;}// 中序线索化二叉树public void threadNodes(){threadNodes(root);}public void threadNodes(ThreadedNode node){if (node == null){  // 当前节点如果为null,直接返回return;}threadNodes(node.leftNode); // 处理左子树// 处理前驱结点if (node.leftNode == null){node.leftNode = pre;  // 让当前节点的左指针指向前驱节点node.leftType = 1; // 改变当前节点左指针的类型}// 处理前驱节点的右指针,如果前驱节点的右指针是null(没有指向右子树)if (pre != null && pre.rightNode == null){pre.rightNode = node; // 让前驱节点的右指针指向当前节点pre.rightType = 1; // 改变前驱节点右指针的类型}pre = node; // 每处理一个节点,当前节点是下一个节点的前驱节点threadNodes(node.rightNode);  // 处理右子树}// 获取根节点public ThreadedNode getRoot() {return root;}// 中序遍历public void midShow() {if (root != null) {root.midShow();}}}

线索二叉树节点类 ThreadedNode

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 void midShow() {// 左节点if (leftNode != null)leftNode.midShow();// 根结点System.out.print(value + " ");// 右节点if (rightNode != null)rightNode.midShow();}}

测试类 TestThreadBinaryTree

public class TestThreadedBinaryTree {public static void main(String[] args) {ThreadedBinaryTree binTree = new ThreadedBinaryTree(); // 创建一颗树ThreadedNode root = new ThreadedNode(1); // 创建一个根节点binTree.setRoot(root); // 把根结点赋给树ThreadedNode rootL = new ThreadedNode(2); // 创建根的左儿子节点root.setLeftNode(rootL); // 将新创建的节点设为根结点的左儿子ThreadedNode rootR = new ThreadedNode(3); // 创建根的右儿子节点root.setRightNode(rootR); // 将新创建的节点设为根结点的右儿子rootL.setLeftNode(new ThreadedNode(4));ThreadedNode fiveNode = new ThreadedNode(5);rootL.setRightNode(fiveNode);rootR.setRightNode(new ThreadedNode(6));System.out.println("**************以上为创建二叉树*************");System.out.print("中序遍历二叉树:");binTree.midShow(); // 中序遍历二叉树System.out.println();binTree.threadNodes(); // 中序线索化二叉树ThreadedNode afterFive = fiveNode.rightNode; //获取5节点的后继节点System.out.println("5节点的后继节点:" + afterFive.value);System.out.print("线索二叉树的遍历:");binTree.threadIterate(); // 线索二叉树的遍历}
}

运行效果:

**************以上为创建二叉树*************
中序遍历二叉树:4 2 5 1 3 6
5节点的后继节点:1
线索二叉树的遍历:4 2 5 1 3 6

【Java数据结构】线索二叉树相关推荐

  1. C语言 题目 1698: 数据结构-线索二叉树

    <大话数据结构>上的,大家可以参考一下  题目描述 在遍历二叉树的过程中,是按照一定的规则将二叉树中的结点排列成一个线性序列,从而得到二叉树中结点的先序序列或中序序列或后序序列.但是,当以 ...

  2. (原)数据结构——线索二叉树

    原文地址:http://www.cnblogs.com/Security-Darren/p/4716082.html 转载务必注明出处! 线索二叉树的思想来源于二叉树的存储结构中,存在一些空的指针域, ...

  3. 数据结构——线索二叉树(TBT)

    文章目录 一.什么是线索二叉树(TBT)? 二.线索二叉树的建立 三.线索二叉树的实现 一.什么是线索二叉树(TBT)? 线索二叉树是一种优化的二叉树结构,对于以结构体指针实现二叉树的方案进行了顺序遍 ...

  4. 【Java 数据结构】二叉树的遍历和基本操作

    一.树型结构 1.概念 2.树的表示形式 二.二叉树 1.特点 2.两种特殊的二叉树 3.二叉树的性质 选择题: 4.二叉树的存储 5.二叉树的基本操作 5.1.创建一棵二叉树 5.2.二叉树的遍历 ...

  5. Java数据结构——认识二叉树

    作者:敲代码の流川枫 博客主页:流川枫的博客 专栏:和我一起学java 语录:Stay hungry stay foolish 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器--牛客 ...

  6. java数据结构编写二叉树_java 数据结构与算法 BinaryTree二叉树编写

    import java.util.Stack; public class BinaryTree { TreeNode root = null; public BinaryTree() { this.r ...

  7. Java数据结构之二叉树及其源码实现

    树 我们的数据结构包含一对一.一对多.多对多的存储关系. 我们常用的一对一的数据结构:数组以及链表:一对多的数据结构:树:多对多:图. 本文主要介绍树的常用结构 二叉树. 二叉树 二叉树基本特点 至多 ...

  8. 【Java数据结构】二叉树的前中后序遍历(递归和非递归)

    二叉树的遍历 递归做法 前序遍历 中序遍历 后序遍历 非递归 前序遍历 中序遍历 后序遍历 二叉树遍历是二叉树的一种重要操作 必须要掌握 二叉树的遍历可以用递归和非递归两种做法来实现 递归做法 前序遍 ...

  9. java数据结构15_二叉树和红黑二叉树

    l 二叉树的定义 二叉树是树形结构的一个重要类型. 许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重 ...

  10. java数据结构之二叉树的定义和递归实现

    定义 最多有两棵子树的有序树,称为二叉树.二叉树是一种特殊的树. 递归定义:二叉树是n(n>=0)个有限结点构成的集合.N=0称为空二叉树:n>0的二叉树由一个根结点和两互不相交的,分别称 ...

最新文章

  1. 几则与西门子相关的消息
  2. 宇宙射线:它们对程序产生影响的概率是多少?
  3. 【开发环境】Ubuntu 中使用 VSCode 开发 C/C++ ③ ( 创建工程目录 | 添加 C++ 源代码 | 代码自动提示 )
  4. GIS坡度分析入门实例 - 使用SuperMap
  5. 蓝桥杯 入门训练 试题集汇总 【A+B问题、序列求和、圆的面积、Fibonacci数列】
  6. matlab同步发电机外特性仿真,基于Matlab-Simulink的虚拟同步发电机控制方法的仿真研究...
  7. application/x-www-form-urlencoded 的contentType,POST数据内容过大,导致tomcat的request取不到参数...
  8. 思维导图学Java编程思想
  9. Python是编译运行的
  10. 在设备上添加项目失败_使用VisualGDB将Keil项目导入VisualStudio
  11. 兰州烧饼 NYOJ--779
  12. 戴尔G7 7588 Windows 10 未安装任何音频输出设备
  13. 儿童专注力训练之找不同2、数数
  14. 突破Edge浏览器的签名验证机制
  15. SAP MM采购信息记录作用与浅析
  16. 247 中心对称数 II
  17. cdr怎么算曲线周长_CorelDRAW X3计算封闭曲线长度和面积
  18. 百万并发下的Nginx优化,看这一篇就够了!
  19. Bonobo Git Server搭建本地(Windows)私有的Git服务器
  20. 【Unity】实现视频播放

热门文章

  1. 企业不同时期该如何做股权布局?
  2. XBOX Series X规格如此强悍,如果被破解安装了win10,将对PC行业带来什么影响?
  3. go使用redis——redigo使用HMSET存储结构体
  4. Navicat 12 安装
  5. SqlServer 更新/新增一条语句,返回其中某一列的值 inserted,@@IDENTITY()
  6. C++STL库中的map容器
  7. tde数据库加密_启用了基于透明数据加密(TDE)的地理复制的Azure SQL数据库
  8. 由查找算法工程的类图分析组合模式
  9. 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)
  10. ZOJ 3810 A Volcanic Island (2014年牡丹江赛区网络赛B题)