用java实现二叉树的前序遍历(递归和迭代)

2023-11-18

目录

1.题目内容

2.用递归实现前序遍历

2.1解题思路

2.2代码

3.用迭代实现前序遍历

3.1解题思路

3.2代码


1.题目内容

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

示例 1:

输入:root = [1,null,2,3]
输出:[1,2,3]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

示例 4:

输入:root = [1,2]
输出:[1,2]

示例 5:

输入:root = [1,null,2]
输出:[1,2]

2.用递归实现前序遍历

2.1解题思路

前序遍历的顺序为根左右。当根为空时,直接返回null;当根不为空时,先输出根节点,再递归的遍历左子树,最后再递归的遍历右子树。

图解(结合代码看)

2.2代码

public void preOrder(TreeNode root){
        if(root==null){
            return;
        }
        System.out.print(root.val+" ");
        preOrder(root.left);
        preOrder(root.right);
    }

3.用迭代实现前序遍历

3.1解题思路

前序遍历的顺序为根左右,我们可以先创建一个栈stack用来存放节点,先将根节点入栈,然后打印根节点的数据。栈是先进后出的结构,所以先入右子树,然后左子树,打印则优先左子树,再打印右子树。当所有节点遍历一遍后,栈为空,结束打印。

 如上图,先将根节点1入栈,此时stack不为空,前序遍历先将根节点出栈打印。再将右子树2入栈。

左子树为空,所以2出栈打印。以2为节点的右子树为空,左子树入栈。

 以3为节点的左右子树都为空,将3出栈打印。此时栈为空,结束遍历。

3.2代码

public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer>list=new ArrayList<>();
        if(root==null){
            return list;
        }
        Deque<TreeNode>stack=new LinkedList<>();
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode node=stack.pop();//出栈顶元素
            list.add(node.val);
            if(node.right!=null){
                stack.push(node.right);
            }
            if(node.left!=null){
                stack.push(node.left);
            }
        }
        return list;
    }

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

用java实现二叉树的前序遍历(递归和迭代) 的相关文章

随机推荐

  • c++用vector先按学生的年级排序,再按学生的分数排序算法

    VectorSort cpp 定义控制台应用程序的入口点 include stdafx h include stdio h include string h include
  • PDF各种编辑方法(页码重排、解密、导入书签、导入注释、合并)

    目录 一 PDF重排页码 二 PDF解密 三 PDF导入和导出书签 四 PDF导入和导出注释 五 PDF合并 一 PDF重排页码 操作流程 如下图所示 打开 福昕高级PDF编辑器 gt 打开待处理的PDF文件 gt 点击软件界面左侧第二个图
  • js循环数组实现模糊匹配

  • Linux 下rm删除命令提示 /bin/rm: argument list too long的解决办法

    假设我们要删除文件夹test test下有很多文件 如果我们使用rm test 命令进行删除 则会出现 bin rm argument list too long无法删除的报错提示 报错提示原因 文件夹下的文件数目过多 命令行过长所致 解决
  • vue项目中引入高德地图

    近期在用vue做一个环保类的项目 要求使用高德地图 原生js api官方案例比较多 对于新手友好 但是在vue项目中加载是一个难以解决的问题 而专门为vue使用高德地图诞生的 vue AMap 组件听起来很美好 但由于需要学习高德原生语法和
  • Redis基础数据结构——有序集合

    Redis基础数据结构 有序集合 redis的有序集合zset类似于Java的SoretedSet和HashMap的结合体 一方面它是一个set 可以保证内部value的唯一性 另一方面它可以给每个value赋予一个score 代表这个sc
  • 100天精通Python(进阶篇)——第36天:Python读写XML文件

    文章目录 一 XML基础概述 1 XML是什么 2 XML的特点及作用 3 XML文件格式 二 Python解析XML文件 1 ElementTree 方式 2 DOM 方式 三 Python写入XML文件 四 Python更新XML文件
  • 硬刚ChatGPT!文心一言能否为百度止颓?中国版ChatGPT“狂飙”的机会在哪儿?

    虽然 ChatGPT 在我的生活中已经出现很久了 但最近我才慢慢跟上了新时代的步伐 今天我想借此话题简单地分享一下OpenAi的看法 以下回答来自ChatGPT的回答 文心一言能否为百度止颓 文心一言是一种文学创作技法 可以用于表达思想感情
  • SSD目标检测流程深入理解

    前言 SSD是经典的一阶目标检测网络框架 特点是速度快 网络简洁 主要思想 1 数据增强 包括光学变换和几何变换 2 网络骨架 SSD在VGG基础上延伸了4个卷积模块 生成不同尺度的特征图 3 PriorBox与多层特征图 在不同尺度设置预
  • 转置卷积(Transposed Convolution)

    文章目录 前言 卷积操作 转置卷积操作 Pytorch中的转置卷积参数 Pytorch转置卷积实验 前言 转置卷积 Transposed Convolution 在语义分割或者对抗神经网络 GAN 中比较常见 其主要作用就是做上采样 UpS
  • 常用电子元件介绍与功能

    常用电子元件简介及其作用 一 电容 1 种类 1 CBB电容 2 铝电解电容 3 钽电解电容 4 高频瓷片电容 5 低频瓷片电容 2 作用 1 去耦 2 滤波器 3 储能 4 检波 5 无源晶振 6 隔直通交 3 总结 二 电感 1 种类
  • 设计分享

    wechat 嵌入式工程师成长日记 https mp weixin qq com s biz Mzg4Mzc3NDUxOQ mid 2247484191 idx 1 sn ceb08f232c86a8da9aa78e6c3fa97e6f c
  • 【JUC并发编程】CopyOnWrite容器详解

    JUC并发编程 CopyOnWrite容器详解 文章目录 JUC并发编程 CopyOnWrite容器详解 一 什么是CopyOnWrite容器 二 CopyOnWriteArrayList 三 CopyOnWrite的业务中实现 一 什么是
  • AD18间距规则设置注意情况(Custom Query)

    在AD18中设置器件间距规则时 通常只能一个器件一个器件地设置 而不能同时设置的原因可能是因为在设置器件间距时 需要考虑到每个器件的具体位置和布局情况 以及器件之间的相互影响 在PCB设计中 器件间距规则是用来确保器件之间有足够的间隔 以避
  • 计算机在智慧交通的应用论文,智能交通的毕业论文

    智能交通的毕业论文 智能运输系统的研究许多国家都投入了巨大的人力和物力 并成为继航空航天 军事领域之后高新技术应用最集中的领域 下面为大家分享了有关智能交通的论文 欢迎欣赏 摘 要 八十年代以来 世界一些发达国家纷纷投入智能交通系统 ITS
  • 指令与指令系统

    一 指令中的操作数 二 指令的寻址方式 具体如下 段地址怎么看 判断它是数据段还是堆栈段还是附加段 如果是数据段 段地址的值为DS的值 其他的以此类推 见上图最后的内容
  • Java JWT: JSON Web Token

    Java JWT JSON Web Token for Java and Android JJWT aims to be the easiest to use and understand library for creating and
  • C++之string类型详解

    参考 C 之string类型详解 云 社区 腾讯云 目录 1 声明一个C 字符串 2 字符串操作函数 2 1 C 字符串和C字符串的转换 2 2 大小和容量函数 2 3 元素存取 2 4 比较函数 2 5 更改内容 2 6 提取子串和字符串
  • eclipse导入项目后出现红色叉号的解决方案

    对于一名程序员来说 我导入的项目在项目的名称上无端加了一个红色的叉号 虽然这个不友好的符号 对于我整个的项目运行没有任何影响 但是总让我觉得不舒服 大大的叉号写在我的项目的脑袋上 我心里能舒服吗 于是我在百度上找到了这篇博文 原文如下 既然
  • 用java实现二叉树的前序遍历(递归和迭代)

    目录 1 题目内容 2 用递归实现前序遍历 2 1解题思路 2 2代码 3 用迭代实现前序遍历 3 1解题思路 3 2代码 1 题目内容 给你二叉树的根节点 root 返回它节点值的 前序 遍历 示例 1 输入 root 1 null 2