给你二叉树的根节点 root ,返回它节点值的中序遍历

news2025/1/11 4:58:07

题目:给你二叉树的根节点 root ,返回它节点值的中序遍历。
要求:非递归实现。

     1
    /  \
   2    3
  / \  / \
 4  5  6  7

中序遍历结果为:

4 2 5 1 6 3 7

这里考察中序遍历思想,使用Stack的后进先出特性输出结果。
TreeNode树状结构

@Data
public class TreeNode {
    int value;
    TreeNode left;
    TreeNode right;

    public TreeNode(int value) {
        this.value = value;
    }
}

buildTree构造树形结构数据

private static TreeNode buildTree() {
        // 定义树形结构数据最大值为7
        TreeNode[] nodes = new TreeNode[7];
        for (int i = 0; i < nodes.length; i++) {
            // 树值从1开始
            nodes[i] = new TreeNode(i + 1);
            int parent = (i + 1) / 2 - 1;
            if (parent >= 0) {
                // 偶数倍,放到左子树,注意i是从0开始算的
                if (i + 1 == 2 * (parent + 1)) {
                    nodes[parent].setLeft(nodes[i]);
                } else {
                    // 奇数倍,放到右子树,注意i是从0开始算的
                    nodes[parent].setRight(nodes[i]);
                }
            }
        }
        return nodes[0];
    }

构造后的图形化展示结果,注意程序不会输出左右斜杠哦~

     1
    /  \
   2    3
  / \  / \
 4  5  6  7

实现算法方案一:借助栈的特性,迭代实现

public static List<TreeNode> traversAl1(TreeNode root) {
        // 中序遍历
        List<TreeNode> myTreeNodeList = new ArrayList();
        Stack<TreeNode> myTreeNodeStack = new Stack<>();
        TreeNode tempNode = root;
        while(tempNode != null || !myTreeNodeStack.isEmpty()){
            // 循环将左子树放入栈
            while(tempNode != null){
                myTreeNodeStack.push(tempNode);
                tempNode = tempNode.getLeft();
            }
            // 对左子树出栈,后进先出
            TreeNode resultNode = myTreeNodeStack.pop();
            // 将结果赛入结果list中
            myTreeNodeList.add(resultNode);
            // 将右子树替换tempNode 
            tempNode = resultNode.getRight();
        }
        return myTreeNodeList;
    }

实现算法方案二:递归实现

 /**
     * 递归实现中序遍历
     *
     * @param root
     * @return
     */
    public static List<TreeNode> traversAl12(TreeNode root){
        List<TreeNode> res = new ArrayList<>();
        inorder(root, res);
        return res;
    }

    public static void inorder(TreeNode root, List<TreeNode> res){
        if(root == null){
            return;
        }
        inorder(root.getLeft(),res);
        res.add(root);
        inorder(root.getRight(),res);
    }

整体代码

public class Test6 {
    public static void main(String[] args) {
        //printTree(traversAl1(buildTree()));// 利用栈迭代实现
        printTree(traversAl12(buildTree())); // 利用递归实现
    }

    public static void printTree(List<TreeNode> nodeList) {
        nodeList.forEach(node -> System.out.print(node.getValue() + " "));
    }

    private static TreeNode buildTree() {
        TreeNode[] nodes = new TreeNode[7];
        for (int i = 0; i < nodes.length; i++) {
            nodes[i] = new TreeNode(i + 1);
            int parent = (i + 1) / 2 - 1;
            if (parent >= 0) {
                if (i + 1 == 2 * (parent + 1)) {
                    nodes[parent].setLeft(nodes[i]);
                } else {
                    nodes[parent].setRight(nodes[i]);
                }
            }
        }
        return nodes[0];
    }

    /**
     * 迭代实现中序遍历
     *
     * @param root
     * @return
     */
    public static List<TreeNode> traversAl1(TreeNode root) {
        // 中序遍历
        List<TreeNode> myTreeNodeList = new ArrayList();
        Stack<TreeNode> myTreeNodeStack = new Stack<>();
        TreeNode tempNode = root;
        // 当根节点不为空或者栈不为空的时候进入循环
        while(tempNode != null || !myTreeNodeStack.isEmpty()){
            // 当中间节点不为空的时候把中间节点放入栈,并指向左子树,一直找到最左的节点,放入栈中再依次弹出栈
            while(tempNode != null){
                myTreeNodeStack.push(tempNode);
                tempNode = tempNode.getLeft();
            }
            TreeNode resultNode = myTreeNodeStack.pop();
            myTreeNodeList.add(resultNode);
            tempNode = resultNode.getRight();
        }
        return myTreeNodeList;
    }

    /**
     * 递归实现中序遍历
     *
     * @param root
     * @return
     */
    public static List<TreeNode> traversAl12(TreeNode root){
        List<TreeNode> res = new ArrayList<>();
        inorder(root, res);
        return res;
    }

    public static void inorder(TreeNode root, List<TreeNode> res){
        if(root == null){
            return;
        }
        inorder(root.getLeft(),res);
        res.add(root);
        inorder(root.getRight(),res);
    }
}

测试结果
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spring项目的创建和使用(详细教程 手把手)方法一

今天我们来讲使用maven方式创建一个sping项目。 1、创建一个普通的maven项目。 2、添加spring框架(引入依赖)支持。添加到pom.xml文件中。 添加的框架有 spring-context&#xff1a;spring 上下⽂&#xff0c;还有 spring-beans&#xff1a;管理对象的模块。 <dependenc…

python将.h5文件转换成csv

五、在jupyter中找到results文件夹&#xff0c;然后可以把跑的.h5结果转换为csv文件 pip install tables import h5py import numpy as np import pandas as pd filename Mnist_FEDL_0.003_0_10u_20b_5_avg.h5 f h5py.File(filename, r) # List all groups print("K…

SpringMVC【文件上传(原生方式上传、上传多文件、异步上传、跨服务器上传 ) 】(五)-全面详解(学习总结---从入门到深化)

目录 SpringMVC文件上传_原生方式上传 SpringMVC文件上传_SpringMVC方式上传 SpringMVC文件上传_上传多文件 SpringMVC文件上传_异步上传 SpringMVC文件上传_跨服务器上传 SpringMVC文件上传_原生方式上传 上传是Web工程中很常见的功能&#xff0c;SpringMVC框架简化了文…

17、SQL注入之二次、加解密、DNS等注入

目录 加解密二次注入DNSlog注入涉及资源:中转注入 加解密 %3D是等号 值在带入数据库之前是有一个解码的操作&#xff0c;明文在解码的时候&#xff0c;就会出现问题&#xff0c;进而影响到语句&#xff1b;密文和明文在一起&#xff0c;这种网站后台是识别不了的&#xff1b;只…

P1332 血色先锋队

血色先锋队 题目背景 巫妖王的天灾军团终于卷土重来&#xff0c;血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团&#xff0c;以及一切沾有亡灵气息的生物。孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重包围&#xff0c;现在他们将主力只好聚集了起来&…

银行家算法C语言代码

/*the code simulate blank algorithm to void deadlock*/ /*author:RongGong*/#include<stdio.h> #define MAX_RES_PROC 100//定义银行家算法的数据结构 int M; // 资源的个数 int N; // 进程的个数 int Available[MAX_RES_PROC] {0}; //可利用资源向量 int MaxNeed[MA…

我们如何在 Elasticsearch 8.6、8.7 和 8.8 中加速数据摄入

作者&#xff1a;Adrien Grand, Joe Gallo, Tyler Perkins 正如你们中的一些人已经注意到的&#xff0c;Elasticsearch 8.6、8.7 和 8.8 在各种数据集上带来了良好的索引加速&#xff0c;从简单的关键字到繁重的 KNN 向量&#xff0c;以及摄取管道繁重的摄取工作负载。 摄取涉及…

Grafana_数据可视化工具

目录 一、简介 二、安装部署 1、下载 2、安装 3、启用 三、使用简介 1、添加数据源 2、创建DashBoard 3、查看dashboard 4、选择查看的时间段 5、阈值颜色控制 源码等资料获取方法 一、简介 Grafana是一个跨平台开源的纯html/js编写的度量分析和可视化工具&#x…

Hydra(九头蛇)密码破解工具的详细使用教程

简介 Hydra是⼀款开源的暴⼒密码pojie⼯具&#xff0c;⽀持多种协议密码的破译。 可以对多种服务的账号和密码进行爆破&#xff0c;包括 数据库、SSH、FTP 等服务&#xff0c;在 Kali Linux 中自带 Hydra。有了这个工具就可以很方便的对密码进行破解。 其简单的使用参数如下&a…

【Java从入门到大牛】面向对象进阶上篇

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Java从入门到大牛 &#x1f320; 首发时间&#xff1a;2023年7月16日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43…

Python应用实例(二)数据可视化(二)

数据可视化&#xff08;二&#xff09; 1.随机漫步1.1 创建RandomWalk类1.2 选择方向1.3 绘制随机漫步图1.4 模拟多次随机漫步1.5 设置随机漫步图的样式 1.随机漫步 使用Python来生成随机漫步数据&#xff0c;再使用Matplotlib以引人瞩目的方式将这些数据呈现出来。随机漫步是…

服务器感染了.halo勒索病毒,如何确保数据文件完整恢复?

引言&#xff1a; 随着信息技术的飞速发展&#xff0c;网络安全威胁也日益猖獗&#xff0c;勒索病毒作为其中的一种&#xff0c;给个人和企业带来了巨大的威胁。.halo勒索病毒作为最近出现的一种恶意软件&#xff0c;以其高度复杂的加密算法和迅速的传播方式而备受关注。它通过…

【群智能算法改进】一种改进的猎人猎物优化算法 IHPO算法[1]【Matlab代码#49】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 原始HPO算法2. 改进后的IHPO算法2.1 Cubic映射初始化2.2 透镜成像折射反向学习2.3 强制切换策略 3. 部分代码展示4. 仿真结果展示5. 资源获取 【获取资源请见文章第5节&#xff1a;资源获取】 1. 原始HPO算法 此算法…

Vue3工程化项目搭建

Vue3工程化项目搭建 源码&#xff1a;vue3-quick-start 预览&#xff1a;vue3-quick-start 一、何为工程化 工程化概述 前端工程化大致可以分为模块化、组件化、规范化和自动化。 规范化 项目目录结构语法提示编码风格规范联调规范文件命名规范代码样式规范git flow 模块…

JS语法学习实战- 流程控制

JS语法学习实战- 流程控制 1. if - else2. switch3. for循环4. while循环5. 更多 JS语法学习实战系列合集 1. if - else if (条件1){条件1成立之后执行的代码 }else if(条件2){条件2成立之后执行的代码 }else{条件不成立之后执行的代码 }2. switch var daynew Date().getDay…

babel兼容低版本游览器

文章目录 1. webpack项目的搭建2. babel 命令行使用3. babel的预设与编译器流程4. babel项目中配置4.1 babel-loader与插件的使用4.2 babel-preset使用 5. 游览器兼容性使用5.1 browserslist工具与编写规则5.2 browserslist配置5.3 优化babel的配置文件 6. polyfill6.1 useBuil…

会声会影 Corel VideoStudio Ultimate 2023 v26.0.0.136 旗舰版百度网盘免费下载

会声会影 Corel VideoStudio Ultimate 2023 v26.0.0.136 旗舰版是一款易于使用&#xff0c;初学者也可以轻使用的&#xff0c;可自定义的 3D 标题、新的面部效果、动画 AR 贴纸、GIF 和摄像机移动过渡&#xff0c;让您轻松、直观地制作最佳视频。探索高级编辑工具&#xff0c;如…

JavaWeb——垃圾回收

目录 一、垃圾回收定义 二、垃圾回收处理内存区域 三、垃圾标记 1、引用计数 &#xff08;1&#xff09;、定义 &#xff08;2&#xff09;、缺陷 2、可达性分析 &#xff08;1&#xff09;、定义 &#xff08;2&#xff09;、缺点 四、垃圾回收过程 1、标记清除 &…

SAP MM 创建双单位采购信息记录

SAP创建不同基本单位的信息记录 1、前台维护MM01 2、ME11维护信息记录 3、通过BAPIBDC实现&#xff1a;ME_INFORECORD_MAINTAIN_MULTIMEK1录屏 因为单独使用ME_INFORECORD_MAINTAIN_MULTI创建信息记录无法创建双单位&#xff0c;创建第一个单位时可以&#xff0c;第二个就会报…

企业邮箱的成本与收费:了解真相,合理选择

企业邮箱的成本对于希望迁移到云端的企业来说可能是一个问题。但这并不一定是必须的。企业邮箱对于今天的企业来说是必不可少的&#xff0c;因为它们提供必要的工具和服务来帮助您与客户、合作伙伴和商业社区保持联系。企业邮箱的收费贵不贵&#xff1f;成本高么&#xff1f; 对…