【java】后序遍历二叉树

采用递归方式实现

节点类

public class Node {

    private int value;
    //父节点
    private Node fNode;
    //左节点
    private Node left;
    //右节点
    private Node right;
    //是否已经打印过
    private boolean sign = false;

    public Node() {
    }

    public boolean isSign() {
        return sign;
    }

    public void setSign(boolean sign) {
        this.sign = sign;
    }

    public Node getfNode() {
        return fNode;
    }

    public void setfNode(Node fNode) {
        this.fNode = fNode;
    }

    public Node getLeft() {
        return left;
    }

    public void setLeft(Node left) {
        this.left = left;
        //设置左节点的父类
        left.setfNode(this);
    }

    public Node getRight() {
        return right;
    }

    public void setRight(Node right) {
        this.right = right;
        //设置右节点的父类
        right.setfNode(this);
    }

    public int getValue() {
        return value;
    }

    public Node setValue(int value) {
        this.value = value;
        return this;
    }
}

递归方法 

//后序遍历二叉树
public static void reducer(Node node) {
    if (node == null) return;
    //判断当前节点是否已经打印,如果没有就进去判断它的左右节点
    if (!node.isSign()) {
        /*
            if:如果左节点不为空并且没有被打印,那么就说明该节点未被调用过,进行递归操作
            else if: 判断完左节点就判断右节点,这是后续遍历的操作顺序
            else : 如果左节点和右节点都打印了,那么就打印当前节点的值,并且回退到上一个节点(父节点)
         */
        if (node.getLeft() != null && !node.getLeft().isSign()) {
            reducer(node.getLeft());
        } else if (node.getRight() != null && !node.getRight().isSign()) {
            reducer(node.getRight());
        } else {
            System.out.print(node.getValue());
            node.setSign(true);
            //如果父节点为空说明已经遍历完了
            if (node.getfNode() != null) {
                reducer(node.getfNode());
            } else {
                return;
            }
        }
    }
}

测试 

public class BinaryIterator {
    public static void main(String[] args) {
        //构建顶级节点的左节点
        Node l = new Node().setValue(2);
        l.setLeft(new Node().setValue(3));
        l.setRight(new Node().setValue(4));
        //构建顶级节点的右节点
        Node r = new Node().setValue(5);
        r.setLeft(new Node().setValue(6));
        r.setRight(new Node().setValue(7));
        //顶节点(起始节点)
        Node node = new Node();
        node.setLeft(l);
        node.setRight(r);
        node.setValue(1);
        //测试
        reducer(node);//rest:3426751
    }

}

草图(想要透彻理解,必须要慢慢根据图进行推演)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/438070.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

京东老矣,尚能饭否?

图片|《冰与火之歌》截图 ©自象限原创 作者丨程心 编辑丨罗辑 从2004年1月,京东正式涉足电商至今,整整二十年过去了。 2024年3月6日,京东发布了2023年第四季度及全年财报。数据显示,2023Q4京东收入3061亿元人民…

腾讯云服务器和阿里云服务器价格测评_2024年费用大PK

2024年阿里云服务器和腾讯云服务器价格战已经打响,阿里云服务器优惠61元一年起,腾讯云服务器61元一年,2核2G3M、2核4G、4核8G、4核16G、8核16G、16核32G、16核64G等配置价格对比,阿腾云atengyun.com整理阿里云和腾讯云服务器详细配…

分段线性化问题探析

目录 1 使用0-1变量将分段函数转换为线性约束 2 连续函数采用分段线性化示例 3 matlab程序测试 4 matlab测试结果说明 5 分段线性化应用 1 使用0-1变量将分段函数转换为线性约束 2 连续函数采用分段线性化示例 3 matlab程序测试 clc;clear all; gn10;tn1; x_pfsdpvar(1, t…

迷你内裤洗衣机排名前十名:推荐十款2024专业性高的内衣洗衣机

最近一段时间,关于内衣到底是机洗好,还是手洗好这个话题,有很多人都在讨论,坚决的手洗党觉得应该用手来清洗,机洗与其它衣物混合使用,会产生交叉感染,而且随着使用时间的推移,会变得…

一命通关前缀和

前缀和 简介 先来简单看一个场景。现在有一个公交车,第一站上了4个人,第二站上了7个人,第三站上了1个人,第四站上了5个人,问一共上了多少人? 答案很显而易见,只需要遍历这个数组,把…

DevEco-Studio 3.1.1 Release和DevEco Studio NEXT Developer Preview1同时安装在mac m2上

其实mas上支持同一个app的多个版本安装的,需要注意的是SDK的目录需要区分开,不能被覆盖。 HarmonyOS和OpenHarmony SDK配置 3.1.1 Release,HarmonyOS的SDK目录:/Users/zhongyili/Library/Huawei/Sdk_3.1 NEXT Developer Previ…

【2】SLoRa: A Systematic Framework for Synergic Interference Resilience In LPWAN

这一篇基于上一篇文章,仅记录我遗忘的知识点; 以较低的成本提供可靠的符号恢复; 符号恢复【振幅和频率】 为了避免环境噪声并提高可靠性,我们采用信号预处理和窗口滑动算法来检测幅度变化点; 信号处理:归一化和指数化…

如何查看前端的vue项目是vue2还是vue3项目

1. 检查package.json文件 在项目的根目录下,打开package.json文件,查找dependencies或devDependencies部分中的vue条目。版本号将告诉你是Vue 2还是Vue 3。例如: Vue 2.x: "vue": "^2.x.x"Vue 3.x: "vue": &…

Rust入门:C++和Rust动态库(dll)的相互调用

无论是C调用Rust动态库还是Rust调用C动态库,其操作基本都是一样地简单,基本和C调用C的动态库没什么区别,只需要列出所需要导入的函数,并链接到相应的lib文件即可。 这里,在windows中,我们以dll动态库为例说…

虽说主业搞前端,看到如此漂亮的网页UI,也是挪不开眼呀。

漂亮的网页UI能够吸引人的眼球,给人留下深刻的印象。作为前端开发人员,可以通过不断学习和掌握设计技巧和工具,提升自己的UI设计能力,为用户提供更好的视觉体验。 以下是一些提升网页UI设计能力的建议: 学习设计基础知…

外包干了一周,技术明显倒退。。。。。

先说一下自己的情况,本科生,2019年我通过校招踏入了南京一家软件公司,开始了我的职业生涯。那时的我,满怀热血和憧憬,期待着在这个行业中闯出一片天地。然而,随着时间的推移,我发现自己逐渐陷入…

【鸿蒙 HarmonyOS 4.0】解决:搜索无效问题

一、背景 页面包含搜索框和列表,列表默认展示所有数据并具有分页功能。然而,在输入关键字到搜索框时,列表未正确展示搜索结果。 二、功能实现 2.1、原代码及实现效果 import ChargeType from ../../viewModel/ChargeType import ChargeMo…

devc++8x8取模软件

这几天在搞arduino nano和单个max7219模块,涉及到16进制的取模,在网上转了一圈,没找到合适的取模软件,于是自己做了一个,试过,可以用,按esc退出并生成16进制的取模结果 源代码: #i…

liunx操作系统 环境变量

环境变量 main函数参数 命令行参数环境变量 环境变量的查看环境变量的获取 main函数参数 命令行参数 main函数是有参数的,只是我们一般不适用 这是main函数从bash中读取进程数据使用的一个基本入口。 下面进行简单演示。 o 好oo都是我们输入的命令行参数。其实&a…

20240304-使用VS2022编译blender3.6.2源代码

20240304-使用VS2022编译blender3.6.2源代码 一、软件环境 Win10 x64 22h2 JuneVS2022 v17.9.0CMake v3.24.4SVN v1.14.3GIT v2.29.2标签:win10 22h2 vs2022 blender 63335分栏:C 二、硬件环境 Win10 x64的PC台式机 三、获取源码 方法一 网盘下载…

安装sqlserver2022最新版只能使用.\SQLEXPRESS登录数据库怎么修改成.

.\SQLEXPRESS “服务器名称 localhost\SQLEXPRESS”中的 “SQLEXPRESS”就是数据库的实例名称/数据库名/服务器名, “localhost”即登录本计算机安装的数据库 安装sqlserver2022最新版只能使用.\SQLEXPRESS登录数据库怎么修改成. 2、查看SQL Server数据库的实例名…

Redis实战—验证码登录功能实现

本博客为个人学习笔记,学习网站:黑马程序员Redis入门到实战 实战篇之验证码登录 目录 基于Session实现登录流程 发送短信验证码 短信验证码登录、注册 校验登录状态 session共享问题 Redis代替session的业务流程 设计Key的结构 设置Key的细节 整…

FreeRTOS操作系统学习——任务管理

任务概念 在FreeRTOS中,一个任务相当于一个线程,可以有很多的任务,每个人任务可以设置不同的优先级。相同优先级的任务轮流使用CPU,高优先级的任务可以一直使用CPU,直到主动放弃,低级的任务才有被执行的机…

Stable Diffusion 模型分享:DucHaiten-AIart-SDXL(动漫、3D、逼真)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 这是一个丰富多彩的 SDXL 模型,可以绘制动漫、3D、科幻、真实等类型的图片。 …

响应式编程五股票订阅系统实现

响应式编程五 使用StepVerifier测试响应式流StepVerifier要点 使用StepVerifier进行高级测试股票订阅系统数据库表 使用StepVerifier测试响应式流 出于测试目的,Reactor 提供了额外的 reactor-test 模块,该模块提供了 StepVerifier。StepVerifier 提供了…