线索二叉树

1. 线索二叉树简介

定义: 在二叉树的结点上加上线索的二叉树称为线索二叉树。

二叉树的线索化: 对二叉树以某种遍历方式(如先序、中序、后序或层次等)进行遍历,使其变为线索二叉树的过程称为对二叉树进行线索化。

现在我们来计算一下任意一颗二叉树有多少个空的指针域

假设有n个结点,一个结点有2个指针域(指向左右子节点),一共就有2n个结点

除了第一个结点不需要父节点指向,其余所有节点均需要指针,所以有n-1个已经使用的指针域

剩下:2*n-(n-1)=n+1

结论:任意二叉树的空余指针域为n+1

如上图所示:红线就是将二叉树线索化变成线索二叉树的过程。

通俗的讲:将普通二叉树的空余指针域都利用起来,指向其前驱结点或后继结点就变成了线索二叉树

2. 线索二叉树的实现

2.1 实现思路

首先我们需要选择线索化二叉树的方式-这里我们使用中序线索化二叉树

在遍历每个节点时,判断结点的左子节点和右子节点是否为空(也就是左右指针域)

如果左子节点为空就将其指向当前结点的前驱结点

如果右子节点为空就指向后继结点(这里的前驱、后继结点是相对于遍历方式而言)

相比普通二叉树我们增加两个标志位:leftType、rightType

2.2 实现代码

二叉树结点类:ThreadedBinaryNode.java

//中序线索二叉树
public class ThreadedBinaryNode {//结点的值int value;//左节点ThreadedBinaryNode leftNode;//右节点ThreadedBinaryNode rightNode;//线索二叉树增加的两个属性//1代表存储的是前驱、后续结点。0代表左右儿子(默认为0)int leftType,rightType;//初始化值public ThreadedBinaryNode(int value){this.value=value;}//设置左节点public void setLeftNode(ThreadedBinaryNode leftNode) {this.leftNode = leftNode;}//设置右节点public void setRightNode(ThreadedBinaryNode rightNode) {this.rightNode = rightNode;}
}

线索二叉树类:ThreadedBinaryTree.java

增加了一个存储前驱结点的pre,主要实现中序线索化的threadedMid方法,遍历方法threadedIterate

public class ThreadedBinaryTree {//根节点ThreadedBinaryNode root;//存储前序结点ThreadedBinaryNode pre=null;//设置根节点、获取根节点public ThreadedBinaryNode getRoot() {return root;}public void setRoot(ThreadedBinaryNode root) {this.root = root;}//遍历中序化线索二叉树public void threadedIterate(){ThreadedBinaryNode 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 threadedMid(){threadedMid(root);}//中序线索化二叉树-将左右指针域为空的标记1,不为空(指向左右儿子)的默认为0public void threadedMid(ThreadedBinaryNode node){if(node==null)return;//递归处理左子树threadedMid(node.leftNode);//处理当前结点的左指针域if(node.leftNode==null){//将当前结点的左指针域指向前序结点node.leftNode=pre;//标记node.leftType=1;}//处理前驱结点pre的右指针域//因为这里拿不到当前结点的下一个结点,所以不能处理当前节点的右指针域if(pre!=null&&pre.rightNode==null){//如果pre的右指针为空,就指向他的后继结点-nodepre.rightNode=node;pre.rightType=1;}//保存当前结点,为下一结点的prepre=node;//递归处理右子树threadedMid(node.rightNode);}
}

测试类

public class TestThreadedTree {public static void main(String[] args) {//创建一颗空二叉树ThreadedBinaryTree threadedBinaryTree = new ThreadedBinaryTree();//创建根结点ThreadedBinaryNode root=new ThreadedBinaryNode(1);threadedBinaryTree.setRoot(root);//创建根结点的左节点和右节点ThreadedBinaryNode leftNode = new ThreadedBinaryNode(2);ThreadedBinaryNode rightNode = new ThreadedBinaryNode(3);//将左右结点连接在根结点后root.setLeftNode(leftNode);root.setRightNode(rightNode);//增加四个节点 4、5、6、7方便遍历leftNode.setLeftNode(new ThreadedBinaryNode(4));leftNode.setRightNode(new ThreadedBinaryNode(5));rightNode.setLeftNode(new ThreadedBinaryNode(6));rightNode.setRightNode(new ThreadedBinaryNode(7));//中序线索化二叉树threadedBinaryTree.threadedMid();//遍历中序线索二叉树System.out.println("遍历中序线索二叉树结果为:");threadedBinaryTree.threadedIterate();}
}

结果:

遍历中序线索二叉树结果为:
4 2 5 1 6 3 7

3. 总结:

线索二叉树减少了的空指针域的同时又对每个节点增加了两个标志位。好处:在遍历时不需要使用递归,相比普通二叉树遍历效率更高在查找前驱/后继结点时更加高效

4. 应用

当路由器使用CIDR,选择下一跳的时候,或者转发分组的时候,通常会用最长前缀匹配(最佳匹配)来得到路由表的一行数据,为了更加有效的查找最长前缀匹配,通常使用的数据结构为二叉线索。

【线索二叉树详解】数据结构06(java实现)相关推荐

  1. 线索二叉树详解(C语言版)

    文章目录 一.定义 二.结构 三.常用操作 结语 附录 一.定义 前面学习了二叉树,在操作过程中发现了几个问题: 问题一:二叉树如何才能实现从一个指定结点开始遍历呢?         问题二:在二叉树 ...

  2. 线索二叉树详解 - C语言

    目录 一.线索二叉树的定义 1.1 线索的概念 1.2 数据结构 1.3 优缺点 二.线索二叉树的构建 2.1 线索化 2.2 实现中序遍历线索化 三.线索二叉树的应用 3.1 求某个结点的中序后继 ...

  3. 详解Scala与Java的互动

    详解Scala与Java的互动

  4. 命令提示符使用java 类报错_lt;03gt;详解第一个Java程序

    详解第一个Java程序视频教程: Java轻松入门经典教程​ke.qq.com 1.编写源程序 新建一个文本文档,名称为HelloWorld,后缀为.java,右键编辑. 编写一个打印HelloWor ...

  5. 数据结构-二叉树-详解

    目录 一.树的概念及结构 1.1树的概念 1.2 树的相关概念​ 1.3树的表示 1.4树在实际中的运用(表示文件系统的目录树结构) 二. 二叉树的概念及结构 2.1概念 2.2特殊二叉树 2.3二叉 ...

  6. 《数据结构C语言版》——二叉树详解(图文并茂)

    哈喽!这里是一只派大鑫,不是派大星.本着基础不牢,地动山摇的学习态度,从基础的C语言语法讲到算法再到更高级的语法及框架的学习.更好地让同样热爱编程(或是应付期末考试 狗头.jpg)的大家能够在学习阶段 ...

  7. Lombok 使用详解,简化 Java 编程

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者 | 日拱一兵 来源 | 公众号(日拱一兵) 在 Java 应 ...

  8. java swing 案例详解_《Java Swing图形界面开发与案例详解》PDF_IT教程网

    资源名称:<Java Swing图形界面开发与案例详解>PDF 内容简介: <Java Swing图形界面开发与案例详解>全书共20章,其中第1-2章主要介绍有关Swing的基 ...

  9. 深入浅出!二叉树详解,包含C语言代码

    [导读]:树是数据结构中的重中之重,尤其以各类二叉树为学习的难点.在考研中,二叉树也是常考的模块.本文主要讲二叉树操作的相关知识.请大家跟随小编一起来复习吧. 本篇针对面试中常见的二叉树操作作个总结: ...

最新文章

  1. Java 反射:框架设计的灵魂
  2. 分享一个模板解析的方法
  3. Java线程池框架核心代码分析
  4. Java设计模式笔记(4)模版方法模式
  5. python 如何定义空字典_python字典中如何添加键值对
  6. 【博客项目】—数据分页(十)
  7. 微信小程序app配置指南
  8. 解决办法:更新linux时候提示“由于没有公钥,无法验证下列签名 ***”
  9. python_迭代器、生成器
  10. Win10找回自带的Windows照片查看器:打开jpg、png、gif格式的图片
  11. python中if缩进规则_Python if条件判断
  12. iMazing2.14.6Mac最新版iOS苹果设备管理器
  13. 智在未来,明年再聚--OFweek2018(第三届)中国高科技产业大会完美闭幕!
  14. Python实现绘制函数图像——以Sigmoid函数为例
  15. 微信小程序新闻列表详情页
  16. php5 imap,LIV. IMAP, POP3 and NNTP Functions - PHP 5 中文文档
  17. RGB接口和MPU接口区别
  18. 【轉】一個在台積電工作3年的工程師寫給學弟學妹們的信
  19. 堆排序|minHeapFixDown的递归和迭代形式
  20. Sheldon Numbers (暴力枚举)

热门文章

  1. python redis 消息队列
  2. 103. Leetcode 213. 打家劫舍 II (动态规划-打家劫舍)
  3. Leetcode 213. 打家劫舍 II (每日一题 20211009)
  4. Leetcode 94.二叉树的中序遍历 (每日一题 20210712)
  5. 二叉堆的优先队列基本原理及实现
  6. 深度学习~循环神经网络RNN, LSTM
  7. 文巾解题 82. 删除排序链表中的重复元素 II
  8. Python应用实战案例-Python协程管理精讲万字长文(建议收藏)
  9. db2查询表结构语句_SQL语句大全,赶快收藏吧!
  10. 量化派基于Hadoop、Spark、Storm的大数据风控架构--转