线索化二叉树

  • 线索化二叉树介绍
  • 线索化二叉树应用案例
  • 线索化二叉树代码实现

线索化二叉树介绍

1、含有n个节点的二叉树中含有n+1个空指针域,利用二叉树中的空指针域,存放指向该节点在某种遍历次序下的前驱节点和后继节点的指针,这种被附加的指针被称为线索

如下图:空指针域共有七个,用公式来算就是2n-(n-1)=n+1,n(Node):代表节点个数
2、这种被加上了线索的二叉链表被称为线索链表,相应的树结构称为线索二叉树,根据线索次序的不同,分为前序线索二叉树,中序线索二叉树,后序线索二叉树

3、一个节点的前一个节点称为前驱节点
4、一个节点的后一个节点称为后继节点

线索化二叉树应用案例

例如:将下图二叉树进行中序线索化,中序遍历的数列为{1,2,3,4,5,6}
中序遍历的结果为:{4,2,5,1,6,3}

当线索化二叉树后,Node节点的属性left和right有如下两种情况
1、left可能指向的是左子树,也可能指向的是前驱节点,例如1节点left指向的左子树,而5节点left指向的是前驱节点
2、right可能指向的是右子树,也可能指向的是后继节点,例如1节点left指向的是右子树,而5节点right指向的是后继节点

线索化二叉树代码实现

package tree;/*** @author shkstart* @create 2021-08-02 10:06*/
public class ThreadedBinaryTreeDemo {public static void main(String[] args) {girl root = new girl(1,"女友1号");girl node2 = new girl(3,"女友2号");girl node3 = new girl(6,"女友3号");girl node4 = new girl(8,"女友4号");girl node5 = new girl(10,"女友5号");girl node6 = new girl(14,"女友6号");//手动创建二叉树root.setLeft(node2);root.setRight(node3);node2.setLeft(node4);node2.setRight(node5);node3.setLeft(node6);//测试中序线索化ThreadedBinaryTree threadedBinaryTree = new ThreadedBinaryTree();threadedBinaryTree.setRoot(root);threadedBinaryTree.threaderNodes();//以10号节点来测试girl leftNode=node5.getLeft();girl rightNode=node5.getRight();System.out.println("10号节点的前驱节点是:"+leftNode);System.out.println("10节点的后继节点是:"+rightNode);}
}
//实现了线索化功能的二叉树
class ThreadedBinaryTree{private girl root;//为了实现线索化,需要创建当前指针的前驱节点指针//再递归进行啊线索化的时候,pre总保持前一个节点private girl pre=null;public void setRoot(girl root) {this.root = root;}//方法的重载public void threaderNodes(){this.threaderNodes(root);}//对二叉树进行中序线索化的方法public void threaderNodes(girl node){//如果node==null,不能被线索化if(node==null){return;}//1、先线索化左子树threaderNodes(node.getLeft());//2、线索化当前节点if(node.getLeft()==null){//让当前节点的左指针指向前驱节点node.setLeft(pre);//修改当前节点左指针类型,指向前驱节点node.setLeftType(1);}//处理后继节点if(pre!=null && pre.getRight()==null){//让前驱节点的右指针指向当前节点pre.setRight(node);//修改前驱节点的右指针类型pre.setRightType(1);}//每处理一个节点后,让当前节点的下一个节点是前驱节点pre=node;//3、线索化右子树threaderNodes(node.getRight());}
}
//创建girlfriends节点
class girl{private int no;//编号private String name;private girl left;//左子节点private girl right;//右子节点//1、如果leftType==0 表示指向的是左子树,leftType==1表示指向前驱节点//2、如果rightType==0,表示指向的是右子树,leftType==1表示的是指向后继节点private int leftType;private int rightType;public girl(int no, String name) {this.no = no;this.name = name;}public int getNo() {return no;}public void setNo(int no) {this.no = no;}public String getName() {return name;}public void setName(String name) {this.name = name;}public girl getLeft() {return left;}public void setLeft(girl left) {this.left = left;}public girl getRight() {return right;}public void setRight(girl right) {this.right = right;}public int getLeftType() {return leftType;}public void setLeftType(int leftType) {this.leftType = leftType;}public int getRightType() {return rightType;}public void setRightType(int rightType) {this.rightType = rightType;}@Overridepublic String toString() {return "girl{" +"no=" + no +", name='" + name + '\'' +'}';}
}

数据结构——>线索化二叉树相关推荐

  1. 数据结构: 线索化二叉树

    public class ThreadedBinaryTreeDemo {public static void main(String[] args) {// 先创建一棵二叉树ThreadedBina ...

  2. 数据结构 - 线索化二叉树(线索化与遍历)

    !!(这里我debug很久才理解过来)** 这里8的前驱为null,所以8的leftType=1,但是6是没有后继的或者说后继为null但是rightType为0(因为后继是在下一个节点来进行连接的, ...

  3. 数据结构-线索化二叉树

    文章目录 1.什么是线索二叉树 2.中序线索化二叉树 2.1 中序线索化二叉树实现 2.2 中序线索化二叉树遍历实现 3.先序线索化二叉树 3.1 先序线索化二叉树实现 3.2 先序线索化二叉树遍历实 ...

  4. 数据结构2:中序线索化二叉树为什么要通过pre设置后继结点

    在听尚硅谷韩顺平老师课程的时候这个地方没有理解,先把java中序线索化二叉树代码附上: private HeroNode pre = null;//在递归线索化,pre总是保留前一个结点 /**** ...

  5. 数据结构之线索化二叉树

    线索化二叉树 在一些项目中需要频繁的遍历二叉树,但是二叉树的遍历比单链表的遍历复杂多了,并且递归总是会有额外开销... 能不能像链表那样方便的快速遍历二叉树呢? 线索化二叉树指的是将二叉树中的结点进行 ...

  6. 数据结构与算法(java):树-二叉树(二叉查找树(BST)、线索化二叉树、哈夫曼树、平衡二叉树【AVL】、二叉树的前中后序遍历)

    二叉树 1.定义 二叉树 就是度不超过2的树(每个结点最多只有两个子结点).如图 2.特殊二叉树 满二叉树 当二叉树的每一个层的结点树都达到最大值,则这个二叉树就是满二叉树. 完全二叉树 叶结点只能出 ...

  7. node 获取表单数据 为空_程序员:数据结构和算法,中序线索化二叉树

    1.中序线索化二叉树   创建如上的二叉树,线索化二叉树时,根据指定的遍历方式得到的节点的访问顺序,一个节点前面的节点,叫做前驱节点,一个节点后面的节点,叫做后继节点.   线索化二叉树的规则:   ...

  8. Java实现前中后序线索化二叉树以及遍历

    文章目录 一.线索化二叉树的原理 二.构建线索化二叉树 三.代码实现线索二叉树 一.线索化二叉树的原理 在前面介绍二叉树的文章中提到,二叉树可以使用两种存储结构:顺序存储和链式存储,在使用链式存储时, ...

  9. java线索二叉树的实现_JAVA递归实现线索化二叉树

    JAVA递归实现线索化二叉树 基础理论 首先,二叉树递归遍历分为先序遍历.中序遍历和后序遍历. 先序遍历为:根节点+左子树+右子树 中序遍历为:左子树+根节点+右子树 后序遍历为:左子树+右子树+根节 ...

  10. 线索化二叉树,中序建立线索,带线索中序遍历,删除,c/c++描述

      二叉树的叶节点的两个指针都没有利用,一些分支节点也可能有一个指针指向NULL,这些指针造成了程序在内存空间上的浪费,但这些叶节点也必不可省.所以我们可以把这些指向NULL的指针,重新赋值,左指针则 ...

最新文章

  1. 加拿大工程院院士于非:互联—— 从质量、能源、信息到智能
  2. Mads Torgersen介绍C# 7及后续版本新特性
  3. u-boot编译过程分析
  4. 猪行天下之Python基础——1.1 Python开发环境搭建
  5. JS module的导出和导入
  6. 树:二叉树的非递归遍历算法
  7. Java线程--扩展
  8. 关于C#日期格式化问题
  9. 模拟京东登陆 java_java京东自动登录
  10. WinSCP显示隐藏文件
  11. pandas之表格条件格式设置
  12. 基于MM32与M26物联网入门:远程呼叫及开锁
  13. 从前端页面上下载为png格式的图片
  14. Docker容器之网络模式
  15. 数据库-订单发票表(单表)
  16. 深圳 IT 男打人后疯狂凡尔赛,还教育民警,这回把 IT 人的脸都丢尽了……
  17. GPS传感器数据帧格式
  18. EBS杂项出库事务处理
  19. 标准清洗槽中的质量参数的监控方法
  20. 巩膜分割论文:ScleraSegNet: an Improved U-Net Model with Attention for Accurate Sclera Segmentation

热门文章

  1. 从零学React Native之11 TextInput
  2. ios控件 UIViewController
  3. 7.卷2(进程间通信)---互斥锁和条件变量
  4. 1.卷2(进程间通信)---简介
  5. 3.高性能MySQL --- 服务器性能剖析
  6. 7. HTTP 请求,响应
  7. 9. grouped product
  8. 27. 搭建Git服务器
  9. Mybatis中javaType和jdbcType对应和CRUD例子
  10. 第二十二篇 定义函数的三种形式以及函数的返回值