java线索二叉树的实现_JAVA递归实现线索化二叉树
JAVA递归实现线索化二叉树
基础理论
首先,二叉树递归遍历分为先序遍历、中序遍历和后序遍历。
先序遍历为:根节点+左子树+右子树
中序遍历为:左子树+根节点+右子树
后序遍历为:左子树+右子树+根节点
(只要记住根节点在哪里就是什么遍历,且都是先左再右)
线索化
现在有这么一棵二叉树,它的数据结构由左节点+权+右节点构成。
可以看到4,5,6,7这几个节点的左右节点空间被浪费了。因此,线索化是指有效利用这些空间。
中序遍历的顺序为:4 2 5 1 6 3 7
现在引入前驱节点以及后继节点。
前驱节点:线索化二叉树时,一个节点的前一个节点
后继节点:线索化二叉树时,一个节点的后一个节点
(例如下图:根据中序遍历,5的前驱节点是2 , 5的后继节点是1)
(中序遍历)实现线索化二叉树
定义数据结构ThreadedNode
//节点的权
int value;
//左儿子
ThreadedNode leftNode;
//右儿子
ThreadedNode rightNode;
//标识指针类型,其中0,1分别表示有无线索化,默认为0
int leftType;
int rightType;
中序遍历
//中序遍历
public void midShow() {
//左子节点
if(leftNode!=null) {
leftNode.midShow();
}
//当前节点
System.out.println(value);
//右子节点
if(rightNode!=null) {
rightNode.midShow();
}
}
这里使用递归的方式来实现。我们先把问题简单化,只看红圈的部分,如下图
定义一个节点pre用来存储当前节点,类似指针。
从根节点1开始递归,如果当前节点为空,返回,到4,此时4的前驱结点为null,结点5的前驱结点为2
遍历到5的时候指向前驱结点2,前驱结点2为上一层递归的指针,因此指向它的前驱结点就行,再把左指针类型置为1
如果当前节点的前驱结点pre的右指针为null,则将它设置为当前节点,此时即4的后继结点为2,并将右指针类型置为1
每处理一个节点,当前节点是下一个节点的前驱节点
线索化二叉树ThreadedBinaryTree
//中序线索化二叉树
public void threadNodes() {
threadNodes(root);
}
public void threadNodes(ThreadedNode node) {
//当前节点如果为null,直接返回
if(node==null) {
return;
}
//处理前驱节点
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;
}
现在再把上面这段代码按照中序遍历的方式放在中间,进行递归
//当前节点如果为null,直接返回
if(node==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);
}
现在编写测试方法
package demo7;
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.setLeftNode(new ThreadedNode(6));
rootR.setRightNode(new ThreadedNode(7));
//中序遍历树
binTree.midShow();
System.out.println("===============");
//中前线索化二叉树
binTree.threadNodes();
binTree.threadIterate();
}
}
java线索二叉树的实现_JAVA递归实现线索化二叉树相关推荐
- c语言线索二叉树作用,C语言递归实现线索二叉树
本文实例为大家分享了C语言递归实现线索二叉树的具体代码,供大家参考,具体内容如下 描述:将二叉树中结点的空左孩子指针域指向前驱结点,将空的右孩子指针域指向后继结点. code: #pragma war ...
- 线索二叉树中序非递归线索化以及递归线索化构建和遍历算法
引文 大部分教材给出了 线索二叉树的中序递归线索化以及中序遍历,但是没给出非递归,现在网上大部分非递归算法代码各种条件判断写的比较离谱,所以干脆自己总结了一个清晰的.线索二叉树中序非递归线索化以及递归 ...
- 线索二叉树,画图教你秒懂线索二叉树(线索二叉树的建立和简单操作)逻辑代码分析
数据结构专升本学习,线索二叉树 前言 前面我们学习树和二叉树的一些基本操作,今天我们学习一个新的知识,学习一下线索二叉树,线索二叉树是由二叉链存储结构变化而来的(我们先得有个二叉链树,再做处理),就是 ...
- 线索二叉树 C语言 数据结构 先序线索二叉树 中序线索二叉树 后序线索二叉树
在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序.中序.后序或层次等)进行遍历,使其变为线索二叉树的过程称为对二叉树进行线索化. 文章目录 一.c语言实现先序线索.中序线 ...
- Java实现二叉树的创建、递归/非递归遍历
近期复习数据结构中的二叉树的相关问题,在这里整理一下 这里包含: 1.二叉树的先序创建 2.二叉树的递归先序遍历 3.二叉树的非递归先序遍历 4.二叉树的递归中序遍历 5.二叉树的非递归中序遍历 6. ...
- 使用java绘图类绘制圆圈_java – 递归绘制圆圈
我想画这个: public void drawCircle(int x, int y, int diameter, int it) { int d = diameter / 3; if (it == ...
- java给xyz大小排序_java递归实现string xyz排序
先用上面的一张图说明逻辑,这就是递归的逻辑. xy排序就相当于在x的空位插上y,x只有两个空位,y插前面得带yx,y插后面得到xy xyz排序就相当于在xy排序的所有结果插上z,结果如图 代码实现如下 ...
- 【Java数据结构】线索二叉树
中序线索二叉树 线索二叉树概述 线索二叉树代码实现 线索二叉树的数据结构 线索二叉树的遍历 线索二叉树示例完整代码 线索二叉树类 ThreadedBinaryTree 线索二叉树节点类 Threade ...
- 重拾算法(3)——用458329个测试用例全面测试二叉树和线索二叉树的遍历算法
重拾算法(3)--用458329个测试用例全面测试二叉树和线索二叉树的遍历算法 在"上一篇"和"上上一篇"中,我给出了二叉树和线索二叉树的遍历算法.给出算法容易 ...
最新文章
- [BizTalk]好用的BizTalk管理工具
- 二叉树的中序遍历(递归和非递归版本)
- python难嘛-为什么说python入门很简单,但是在你这很难?
- Simulink仿真 离散系统仿真
- Samba nsswitch/pam_winbind.c文件输入验证漏洞
- python基础(part6)--容器类型之通用操作
- javascript中children和childNodes的区别
- Lucene实战之初体验
- Twisted SSH
- 前后落差大用什么词语_在海边拍婚纱照,需要准备什么东西呢?海景婚纱摄影这些要注意...
- K8s运行dashboard命令启动报错:no endpoints available for service \kubernetes-dashboard\
- pacs文件浏览工具_啥?网络攻击浏览器让你惊惶失措?这里教你防患未然
- Postfix邮件服务系统
- Solid angle to Arnold for Cinema4D破解教程
- Windows下 VMware XP虚拟机 架设论坛
- java老九_【老九】【Java】小议转义字符
- 开始讨厌现在这种生活
- 用Java语言实现文本内容对比的算法和程序
- 递归语言、递归可枚举语言和非递归可枚举语言
- motrix高速下载百度网盘资源的方法
热门文章
- python diff函数_使用Python创建你自己的diff工具
- ci mysql操作_CI框架数据库各类操作
- 层和 native_React-Native与小程序的底层框架比较
- δ在web里面怎么输入_【高等数学】用ε-δ语言证明函数极限
- 谷歌吃苹果:新系统让Macbook秒变Chromebook
- 6行代码!用Python将PDF转为word
- 家用电器用户行为分析与事件识别_8个步骤,教你如何开始用户行为分析
- 从零开始数据科学与机器学习算法-线性回归-02
- ubuntu安装javahadoop
- 【数据结构】排序算法及优化整理