java 线索二叉树的构建

2023-05-16

public class test {
    public static void main(String[] args) {
        Node root = new Node(1);
        Node node2 = new Node(2);
        Node node3 = new Node(3);
        Node node4 = new Node(4);
        Node node5 = new Node(5);
        Node node6 = new Node(6);
        Tree tree = new Tree();
        tree.root = root;
        root.setLeft(node2);
        root.setRight(node3);
        node2.setLeft(node4);
        node2.setRight(node5);
        node3.setLeft(node6);
        tree.indixThread(root);
        tree.throughIndixThread(root);
    }
}

class Tree{
    // 自己的线索二叉树
    public Node root;
    public Node pre = null;
    public Tree(){

    }
    // 可以进行中序线索化和不使用递归的中序遍历
    public void indixThread(Node node){
        if(node==null){
            return ;
            // 退出
        }
        // 左中右
        indixThread(node.getLeft());
        // 来中 前 后
        if(node.getLeft()==null){
            node.setLeft(pre);
            node.setLefttype(1);
        }
        if(pre!=null&&pre.getRight()==null){
            pre.setRight(node);
            pre.setRighttype(1);
        }
        // 更新
        pre = node;
        // 后
        indixThread(node.getRight());
    }
    // 进行线索二叉树的中序遍历
    public void throughIndixThread(Node node){
        while(node!=null){
            while(node.getLefttype()==0){
                node = node.getLeft();
            }
            System.out.println(node);
            while(node.getRighttype()==1){
                node = node.getRight();
                System.out.println(node);

            }
            node = node.getRight();
        }
    }
}
class Node{
    // 节点类 需要val left right leftType rightType
    int val;
    Node left;
    Node right;

    @Override
    public String toString() {
        return "Node{" +
                "val=" + val +
                '}';
    }

    int lefttype;
    int righttype;

    public Node(int val) {
        this.val = val;
    }

    public int getVal() {
        return val;
    }

    public void setVal(int val) {
        this.val = val;
    }

    public Node getLeft() {
        return left;
    }

    public void setLeft(Node left) {
        this.left = left;
    }

    public Node getRight() {
        return right;
    }

    public void setRight(Node 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;
    }
}

线索二叉树是用二叉树中多余的 n+1 个指针来构建当前节点的前序和后继的过程 下面我来解释一下如何从普通的二叉树构建成线索二叉树以及不使用递归来进行线索二叉树的中序遍历

public void indixThread(Node node){
        if(node==null){
            return ;
            // 退出
        }
        // 左中右
        indixThread(node.getLeft());
        // 来中 前 后
        if(node.getLeft()==null){
            node.setLeft(pre);
            node.setLefttype(1);
        }
        if(pre!=null&&pre.getRight()==null){
            pre.setRight(node);
            pre.setRighttype(1);
        }
        // 更新
        pre = node;
        // 后
        indixThread(node.getRight());
    }

我们的tree类定义了一个pre 这个就是当前节点按照遍历的顺序的前一个节点 当我们遍历到第一个元素的时候 它是没有前一个节点的 因为它是遍历的第一个 所以它的前一个节点就是null 

我们初始化pre的时候就为null

我们有了node 当前节点和 pre上一个节点 就可以判断能不能搭桥

// 由于是中序遍历 我们需要先左 再中右

indixThread(node.left);

if(node.left==null) 当前节点没有左指针 就利用这个节点指向前一个节点

node.setLeft(pre)

在判断前一个节点

if(pre!=null&&pre.right==null){

        pre.setRight(node)
}

这时 我们正式完成了指针的利用 需要进入到下一个节点 所以就需要更新pre的值

pre = node;

最后 进入到右子树进行遍历

indixThread(node.right);

 

public void throughIndixThread(Node node){
        while(node!=null){
            while(node.getLefttype()==0){
                node = node.getLeft();
            }
            System.out.println(node);
            while(node.getRighttype()==1){
                node = node.getRight();
                System.out.println(node);

            }
            node = node.getRight();
        }
    }

进行线索二叉树的无递归遍历

我们首先要找到第一个元素 由于是中序遍历 所以它的特点是在左子树第一个leftType为1的地方

因为我们设置它的前序是null 

使用while来寻找 直到找到 打印出这个节点

当right的type为1时 right就是下一个节点 我们可以直接打印

while(node.getRightType()==1){

node = node.right();

sout(node);

}        

当出循环的时候 就来到了中间的节点 因为它本来就有右子树 所以righttype为0

我们需要进入右子树再进行中序遍历的逻辑 所以

node = node.getRight(); 此时停手 进入下一轮循环

相当于进入右子树后在根据中序遍历的逻辑进行判断.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 线索二叉树的构建 的相关文章

  • mini6410上HelloQt4运行出现libQtGui.so.4: cannot open shared的原因

    主要原因是在3 3 3节中 xff0c 编写的环境变量搭建文件setqt4env中设置路径不对 export LD LIBRARY PATH 61 xff08 看看有没有文件中的目录 xff09 应该改成你所在的qt4 7目录中的lib目录
  • VINS技术路线与代码详解

    VINS技术路线 写在前面 xff1a 本文整和自己的思路 xff0c 希望对学习VINS或者VIO的同学有所帮助 xff0c 如果你觉得文章写的对你的理解有一点帮助 xff0c 可以推荐给周围的小伙伴们 xff0c 当然 xff0c 如果
  • 用MicroPython开发ESP32- 用Thonny写程序

    陈拓 2022 06 11 2022 06 12 1 简介 在 用MicroPython开发ESP32 固件烧写与测试 https zhuanlan zhihu com p 527291091 https blog csdn net che
  • 单片机 stm32 接收数据和处理

    背景 1 单片机串口接收数据处理 xff0c 这个代码已经过很多项目验证 xff0c 没有问题 用这个代码帮了好几个同事解决数据接收久了就异常 2 这个代码做到接收和处理分开 避免不必要的处理逻辑问题 3 也可用于网口tcp xff0c u
  • odroid Xu4介绍

    Odroid xu4介绍 下面对这块开发板做一下简单的介绍 xff0c 共需要用到的人参考 从参数上来看 xff0c ODROID XU4的整体性能基本和目前的中端智能手机差不多 xff0c 它搭载了主频
  • OdroidXu4开发环境搭建

    OdroidXu4开发环境搭建 一 烧录镜像 1 SD卡烧录 首先准备一张至少16G的sd卡 镜像可以在官网 xff1a http odroid com dokuwiki doku php id 61 en odroid xu4 softw
  • 大小端:字节序与比特序

    https blog csdn net fzy0201 article details 26876711 https blog csdn net qq 40334837 article details 89042607 前言 前两天被问到一
  • VLC Buffering机制介绍

    一 简介 了解一定播放器知识的同学应该都知道 xff0c 播放器内部是有缓存的 xff08 非直播场景 xff09 缓存的作用主要是解决生产者和消费者速度的不匹配 xff0c 给用户更好的使用体验 例如 xff0c 在网络不稳定的情况下 x
  • Linux静态库和动态库学习总结

    一 废话 之前由于工作需要 xff0c 要封装一个Linux加密解密转换的动态库 xff0c 这个之前只做过Windows下面的 xff0c Linux下面还真没有做过 xff0c 之后做了整一个晚上才算做好 xff0c 不过其中也学到了不
  • UART的FIFO功能

    经常听到UART的FIFO功能 xff0c 但是从来没有真正使用过和认真思考过它的作用 正好有客户用到这个功能 xff0c 在这里做个总结 FIFO 是 First In First Out 的缩写 xff0c 它是一个具有先入先出特点的缓
  • 《C语言内核深度解析》笔记(3):指针才是C语言的精髓

    第03章 指针才是C语言的精髓 3 2 指针 int a 61 10 int p 61 amp a 指针变量p和普通变量之间没有本质区别 xff0c 都是变量空间放了一个数值 xff0c 只是p里面的数值比较特殊 xff0c 是a空间的地址
  • 相机针孔模型----从世界坐标系,到相机坐标系,再到图像物理坐标系,最后到图像像素坐标系的转换过程解析

    看了很多讲解针孔相机模型中从世界坐标系 gt 到相机坐标系 gt 图像坐标系的文章 xff0c 心里的疑惑也逐渐展开 xff0c 现在总结一下自己的理解 xff1a 世界坐标系 相机坐标系 图像物理坐标系 图像像素坐标系在我的另一篇博文里已
  • D1 R32 – ESP32+Arduino CNC Shield控制步进电机

    陈拓 2023 04 01 2023 04 05 1 简介 在 Arduino Uno开发板 43 电机驱动扩展版CNC Shield V3 0硬件说明 https blog csdn net chentuo2000 article det
  • pixhawk当中关于NMEA类型的gps数据处理流程

    1 启动跟新gps的数据的任务是在ArduCopter cpp中scheduler tasks中 调用的速度是50hz 2 通过执行update GPS方法中的 3 调转到ap gps cpp中的update方法中 4 在update中通过
  • C++Eigen库的配置和基本使用

    1 配置 1 下载 http bitbucket org eigen eigen get 3 2 5 tar bz2 2 配置 文件夹名字较长 xff0c 解压后可重命名 xff0c 如我命名为eigen3 xff0c 把D program
  • C++:extern "c"用法解析

    引言 C 43 43 保留了一部分过程式语言的特点 xff0c 因而它可以定义不属于任何类的全局变量和函数 但是 xff0c C 43 43 毕竟是一种面向对象的程序设计语言 xff0c 为了支持函数的重载 xff0c C 43 43 对全
  • 堆栈的作用,以及存放的数据

    在计算机领域 xff0c 堆栈是一个不容忽视的概念 xff0c 但是很多人甚至是计算机专业的人也没有明确堆栈其实是两种数据结构 堆栈都是一种数据项按序排列的数据结构 xff0c 只能在一端 称为栈顶 top 对数据项进行插入和删除 要点 x
  • STM32 姿态传感器mpu6050的使用

    文章目录 特性引脚说明使用I2C软件 xff0c 驱动mpu6050手册中寄存器描述MPU6050初始化的步骤 xff1a 数据读取mpu6050输出的值 特性 MPU6050 xff0c 能同时检测三轴加速度 三轴陀螺仪 三轴角速度 的运
  • STM32 GPS定位

    文章目录 ATGM332D简介特性引脚接入串口通信NMEA 协议解析串口输出nmealib在linux下使用 ATGM332D简介 高性能 低功耗 GPS 北斗双模定位模块 特性 特性说明基本功能三维位置定位 经纬度 海拔 xff0c 测速
  • 树莓派笔记13:舵机云台(一)

    最近买了个小型舵机云台模块来玩 xff0c 淘宝上卖这个的挺多的 xff0c 一般三四十块钱 xff0c 很多还卖配套的摄像头 说是云台 xff0c 其实就是用两个舵机结合固定板做的支撑模块 xff0c 两个舵机分别控制左右和上下的转动 1

随机推荐