【Java数据结构】线索二叉树
中序线索二叉树
- 线索二叉树概述
- 线索二叉树代码实现
- 线索二叉树的数据结构
- 线索二叉树的遍历
- 线索二叉树示例完整代码
- 线索二叉树类 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数据结构】线索二叉树相关推荐
- C语言 题目 1698: 数据结构-线索二叉树
<大话数据结构>上的,大家可以参考一下 题目描述 在遍历二叉树的过程中,是按照一定的规则将二叉树中的结点排列成一个线性序列,从而得到二叉树中结点的先序序列或中序序列或后序序列.但是,当以 ...
- (原)数据结构——线索二叉树
原文地址:http://www.cnblogs.com/Security-Darren/p/4716082.html 转载务必注明出处! 线索二叉树的思想来源于二叉树的存储结构中,存在一些空的指针域, ...
- 数据结构——线索二叉树(TBT)
文章目录 一.什么是线索二叉树(TBT)? 二.线索二叉树的建立 三.线索二叉树的实现 一.什么是线索二叉树(TBT)? 线索二叉树是一种优化的二叉树结构,对于以结构体指针实现二叉树的方案进行了顺序遍 ...
- 【Java 数据结构】二叉树的遍历和基本操作
一.树型结构 1.概念 2.树的表示形式 二.二叉树 1.特点 2.两种特殊的二叉树 3.二叉树的性质 选择题: 4.二叉树的存储 5.二叉树的基本操作 5.1.创建一棵二叉树 5.2.二叉树的遍历 ...
- Java数据结构——认识二叉树
作者:敲代码の流川枫 博客主页:流川枫的博客 专栏:和我一起学java 语录:Stay hungry stay foolish 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器--牛客 ...
- java数据结构编写二叉树_java 数据结构与算法 BinaryTree二叉树编写
import java.util.Stack; public class BinaryTree { TreeNode root = null; public BinaryTree() { this.r ...
- Java数据结构之二叉树及其源码实现
树 我们的数据结构包含一对一.一对多.多对多的存储关系. 我们常用的一对一的数据结构:数组以及链表:一对多的数据结构:树:多对多:图. 本文主要介绍树的常用结构 二叉树. 二叉树 二叉树基本特点 至多 ...
- 【Java数据结构】二叉树的前中后序遍历(递归和非递归)
二叉树的遍历 递归做法 前序遍历 中序遍历 后序遍历 非递归 前序遍历 中序遍历 后序遍历 二叉树遍历是二叉树的一种重要操作 必须要掌握 二叉树的遍历可以用递归和非递归两种做法来实现 递归做法 前序遍 ...
- java数据结构15_二叉树和红黑二叉树
l 二叉树的定义 二叉树是树形结构的一个重要类型. 许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重 ...
- java数据结构之二叉树的定义和递归实现
定义 最多有两棵子树的有序树,称为二叉树.二叉树是一种特殊的树. 递归定义:二叉树是n(n>=0)个有限结点构成的集合.N=0称为空二叉树:n>0的二叉树由一个根结点和两互不相交的,分别称 ...
最新文章
- 几则与西门子相关的消息
- 宇宙射线:它们对程序产生影响的概率是多少?
- 【开发环境】Ubuntu 中使用 VSCode 开发 C/C++ ③ ( 创建工程目录 | 添加 C++ 源代码 | 代码自动提示 )
- GIS坡度分析入门实例 - 使用SuperMap
- 蓝桥杯 入门训练 试题集汇总 【A+B问题、序列求和、圆的面积、Fibonacci数列】
- matlab同步发电机外特性仿真,基于Matlab-Simulink的虚拟同步发电机控制方法的仿真研究...
- application/x-www-form-urlencoded 的contentType,POST数据内容过大,导致tomcat的request取不到参数...
- 思维导图学Java编程思想
- Python是编译运行的
- 在设备上添加项目失败_使用VisualGDB将Keil项目导入VisualStudio
- 兰州烧饼 NYOJ--779
- 戴尔G7 7588 Windows 10 未安装任何音频输出设备
- 儿童专注力训练之找不同2、数数
- 突破Edge浏览器的签名验证机制
- SAP MM采购信息记录作用与浅析
- 247 中心对称数 II
- cdr怎么算曲线周长_CorelDRAW X3计算封闭曲线长度和面积
- 百万并发下的Nginx优化,看这一篇就够了!
- Bonobo Git Server搭建本地(Windows)私有的Git服务器
- 【Unity】实现视频播放
热门文章
- 企业不同时期该如何做股权布局?
- XBOX Series X规格如此强悍,如果被破解安装了win10,将对PC行业带来什么影响?
- go使用redis——redigo使用HMSET存储结构体
- Navicat 12 安装
- SqlServer 更新/新增一条语句,返回其中某一列的值 inserted,@@IDENTITY()
- C++STL库中的map容器
- tde数据库加密_启用了基于透明数据加密(TDE)的地理复制的Azure SQL数据库
- 由查找算法工程的类图分析组合模式
- 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)
- ZOJ 3810 A Volcanic Island (2014年牡丹江赛区网络赛B题)