当前位置: 首页 > news >正文

力扣144 二叉树的前序遍历 Java版本

文章目录

  • 题目描述
  • 递归方法
    • 代码
  • 非递归方法
    • 代码


题目描述

给你二叉树的根节点 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]

提示:

树中节点数目在范围 [0, 100] 内
-100 <= Node.val <= 100

进阶:递归算法很简单,你可以通过迭代算法完成吗?

递归方法

递归的第一步就是找到递归出口,这里是root为null的时候结束递归,因为如果root为null则既没有val也没有子树,所以就不需要继续往下递归了。
接下来就是按照需要遍历的顺序来执行此方法,大部分时候不要深入考虑递归的具体实现,因为越是考虑越是混乱,直接按照顺序交给计算机去执行就可以了。

代码

class Solution {//使用递归的方法来进行前序遍历public List<Integer> preorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();preorder(root,result);return  result;}public void preorder(TreeNode root,List<Integer> result){//递归出口if (root==null) {return;}//遍历中间节点result.add(root.val);//遍历左孩子preorder(root.left,result);//遍历右孩子preorder(root.right,result);}
}

非递归方法

思路在代码中详细注释了

代码

class Solution {//使用非递归的方法来完成public List<Integer> preorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();preorder(root,result);return  result;}public void preorder(TreeNode root,List<Integer> result){//如果root为空则直接返回if (root==null){return;}//前序遍历需要把当前节点遍历完,再把左子树都遍历完之后,再开始遍历右子树//每个节点都是这样的顺序,所以需要保存记录当前节点的右孩子,因为需要左子树都遍历完才轮到右孩子//考虑使用栈的方法,因为栈可以先把一部分暂时不用的信息保存到栈中Stack<TreeNode> stack = new Stack<>();//先把root入栈stack.push(root);//循环遍历直到所有节点都完成遍历while (!stack.isEmpty()){TreeNode treeNode = stack.pop();result.add(treeNode.val);//将右孩子入栈,再将左孩子入栈,这样出栈之后才是左孩子优先if(treeNode.right!=null){//如果是空的就不需要入栈了stack.push(treeNode.right);}//将左孩子入栈if(treeNode.left!=null){stack.push((treeNode.left));}}}
}
http://www.lryc.cn/news/294178.html

相关文章:

  • 《Vue3 基础知识》 使用 GoGoCod 升级到Vue3+ElementPlus 适配处理
  • c#string方法对比
  • Electron实战(一):环境搭建/Hello World/打包exe
  • 【C++】运算符重载详解
  • 评论区功能的简单实现思路
  • Java自救手册
  • ASM-HEMT参数提取和模型验证测试
  • 浅压缩、深压缩、双引擎、计算机屏幕编码……何去何从?
  • 2020年通信工程师初级专业实务真题
  • Linux常见面试题汇总
  • C语言小游戏:贪吃蛇(游戏开发的环境和功能介绍)
  • ElementUI Form:InputNumber 计数器
  • apk反编译修改教程系列---修改apk的默认颜色 布局颜色 手机电脑同步演示【十】
  • 响应式开发如何设置断点,小屏幕界面该如何显示(有动图)
  • Java基础 集合(二)List详解
  • UE4运用C++和框架开发坦克大战教程笔记(十七)(第51~54集)
  • GaussDB新体验,新零售选品升级注入新思路【华为云GaussDB:与数据库同行的日子】
  • C语言问题汇总
  • QT 的 blockSignals(true) 的作用范围
  • 【C++私房菜】类和对象万字详解
  • PDF下载添加水印和访问密码
  • 基于SSM+MySQL的的新闻发布系统设计与实现
  • 记录首次使用yolov8-obb
  • 深度学习环境配置:Anaconda 安装和 pip 源
  • 100 个 NLP 面试问题
  • C# OMRON PLC FINS TCP协议简单测试
  • MQTT在linux下服务端和客户端的应用
  • 韦达定理用处多
  • Kotlin-类
  • redis基本数据结构介绍