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递归实现线索化二叉树相关推荐

  1. c语言线索二叉树作用,C语言递归实现线索二叉树

    本文实例为大家分享了C语言递归实现线索二叉树的具体代码,供大家参考,具体内容如下 描述:将二叉树中结点的空左孩子指针域指向前驱结点,将空的右孩子指针域指向后继结点. code: #pragma war ...

  2. 线索二叉树中序非递归线索化以及递归线索化构建和遍历算法

    引文 大部分教材给出了 线索二叉树的中序递归线索化以及中序遍历,但是没给出非递归,现在网上大部分非递归算法代码各种条件判断写的比较离谱,所以干脆自己总结了一个清晰的.线索二叉树中序非递归线索化以及递归 ...

  3. 线索二叉树,画图教你秒懂线索二叉树(线索二叉树的建立和简单操作)逻辑代码分析

    数据结构专升本学习,线索二叉树 前言 前面我们学习树和二叉树的一些基本操作,今天我们学习一个新的知识,学习一下线索二叉树,线索二叉树是由二叉链存储结构变化而来的(我们先得有个二叉链树,再做处理),就是 ...

  4. 线索二叉树 C语言 数据结构 先序线索二叉树 中序线索二叉树 后序线索二叉树

    在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序.中序.后序或层次等)进行遍历,使其变为线索二叉树的过程称为对二叉树进行线索化. 文章目录 一.c语言实现先序线索.中序线 ...

  5. Java实现二叉树的创建、递归/非递归遍历

    近期复习数据结构中的二叉树的相关问题,在这里整理一下 这里包含: 1.二叉树的先序创建 2.二叉树的递归先序遍历 3.二叉树的非递归先序遍历 4.二叉树的递归中序遍历 5.二叉树的非递归中序遍历 6. ...

  6. 使用java绘图类绘制圆圈_java – 递归绘制圆圈

    我想画这个: public void drawCircle(int x, int y, int diameter, int it) { int d = diameter / 3; if (it == ...

  7. java给xyz大小排序_java递归实现string xyz排序

    先用上面的一张图说明逻辑,这就是递归的逻辑. xy排序就相当于在x的空位插上y,x只有两个空位,y插前面得带yx,y插后面得到xy xyz排序就相当于在xy排序的所有结果插上z,结果如图 代码实现如下 ...

  8. 【Java数据结构】线索二叉树

    中序线索二叉树 线索二叉树概述 线索二叉树代码实现 线索二叉树的数据结构 线索二叉树的遍历 线索二叉树示例完整代码 线索二叉树类 ThreadedBinaryTree 线索二叉树节点类 Threade ...

  9. 重拾算法(3)——用458329个测试用例全面测试二叉树和线索二叉树的遍历算法

    重拾算法(3)--用458329个测试用例全面测试二叉树和线索二叉树的遍历算法 在"上一篇"和"上上一篇"中,我给出了二叉树和线索二叉树的遍历算法.给出算法容易 ...

最新文章

  1. [BizTalk]好用的BizTalk管理工具
  2. 二叉树的中序遍历(递归和非递归版本)
  3. python难嘛-为什么说python入门很简单,但是在你这很难?
  4. Simulink仿真 离散系统仿真
  5. Samba nsswitch/pam_winbind.c文件输入验证漏洞
  6. python基础(part6)--容器类型之通用操作
  7. javascript中children和childNodes的区别
  8. Lucene实战之初体验
  9. Twisted SSH
  10. 前后落差大用什么词语_在海边拍婚纱照,需要准备什么东西呢?海景婚纱摄影这些要注意...
  11. K8s运行dashboard命令启动报错:no endpoints available for service \kubernetes-dashboard\
  12. pacs文件浏览工具_啥?网络攻击浏览器让你惊惶失措?这里教你防患未然
  13. Postfix邮件服务系统
  14. Solid angle to Arnold for Cinema4D破解教程
  15. Windows下 VMware XP虚拟机 架设论坛
  16. java老九_【老九】【Java】小议转义字符
  17. 开始讨厌现在这种生活
  18. 用Java语言实现文本内容对比的算法和程序
  19. 递归语言、递归可枚举语言和非递归可枚举语言
  20. motrix高速下载百度网盘资源的方法

热门文章

  1. python diff函数_使用Python创建你自己的diff工具
  2. ci mysql操作_CI框架数据库各类操作
  3. 层和 native_React-Native与小程序的底层框架比较
  4. δ在web里面怎么输入_【高等数学】用ε-δ语言证明函数极限
  5. 谷歌吃苹果:新系统让Macbook秒变Chromebook
  6. 6行代码!用Python将PDF转为word
  7. 家用电器用户行为分析与事件识别_8个步骤,教你如何开始用户行为分析
  8. 从零开始数据科学与机器学习算法-线性回归-02
  9. ubuntu安装javahadoop
  10. 【数据结构】排序算法及优化整理