题目:

给定一个二叉树,返回它的中序 遍历。

Given a binary tree, return the inorder traversal of its nodes' values.

示例:

输入: [1,null,2,3]
1
\
2
/
3 输出: [1,3,2]

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

Follow up: Recursive solution is trivial, could you do it iteratively?

解题思路:

百度百科:二叉树的中序遍历:https://baike.baidu.com/item/中序遍历

遍历顺序:左子节点 --> 根节点 --> 右子节点

如下所示的二叉树:

       A
/ \
B C
/ \ / \
D E F G

其遍历顺序为:D -> B -> E -> A ->F -> C -> G

二叉树遍历可以用 DFS(深度优先搜索)完成,其实现方式为:递归或借助数据结构 栈 迭代。

这种遍历方式本质上是一个先进后出的栈式遍历方式,递归方法实际也是用递归方式实现栈的先进后出。

DFS-递归:

Java:

class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();//数组
dfs_recursion(root, list);//传入递归函数
return list;
} private void dfs_recursion(TreeNode node, List<Integer> list) {
if (node == null) return;//基线条件
dfs_recursion(node.left, list);//先遍历左子节点
list.add(node.val);//遍历到左子节点的顶点,取出该节点的值
dfs_recursion(node.right, list);//递归遍历右节点
}
}

Python3:

class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
#数组
res = list()
#传入递归函数
self.dfs_recursion(root, res)
return res def dfs_recursion(self, node: TreeNode, res: List[int]):
#基线条件
if not node: return
#递归遍历左子节点
self.dfs_recursion(node.left, res)
#取顶点节点的值
res.append(node.val)
#递归遍历右子节点
self.dfs_recursion(node.right, res)

DFS-迭代:

Java:

class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();//数组
if (root == null) return list;
Stack<TreeNode> stack = new Stack<>();//用数据结构栈暂存节点
TreeNode cur = root;//定义当前节点
while (!stack.isEmpty() || cur != null) {//循环条件:栈不空或当前节点不空
if (cur != null) {//当前节点不空时
stack.push(cur);//当前节点入栈
cur = cur.left;//刷新当前节点
} else {//当前节点空时
cur = stack.pop();//当前节点的父节点出栈
list.add(cur.val);//数组存入节点的值
cur = cur.right;刷新当前节点
}
}
return list;
}
}

Python:

class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
#初始化数组、栈
res, stack = list(), list()
#当前节点指向根节点
cur = root
#递归条件为:栈或当前节点非空
while stack or cur:
if cur:
#当前节点非空时入栈
stack.append(cur)
#刷新当前节点
cur = cur.left
else:
#当前节点为空时其父节点出栈
cur = stack.pop()
#其值存入数组
res.append(cur.val)
#刷新当前节点
cur =cur.right
return res

一起学习吖,欢迎关注:爱写Bug

LeetCode 94:二叉树的中序遍历 Binary Tree Inorder Traversal的更多相关文章

  1. LeetCode 94. 二叉树的中序遍历(Binary Tree Inorder Traversal)

    94. 二叉树的中序遍历 94. Binary Tree Inorder Traversal 题目描述 给定一个二叉树,返回它的 中序 遍历. LeetCode94. Binary Tree Inor ...

  2. [Swift]LeetCode94. 二叉树的中序遍历 | Binary Tree Inorder Traversal

    Given a binary tree, return the inorder traversal of its nodes' values. Example: Input: [1,null,2,3] ...

  3. LeetCode 145. 二叉树的后序遍历(Binary Tree Postorder Traversal)

    145. 二叉树的后序遍历 145. Binary Tree Postorder Traversal 题目描述 给定一个二叉树,返回它的 后序 遍历. LeetCode145. Binary Tree ...

  4. Java实现 LeetCode 94 二叉树的中序遍历

    94. 二叉树的中序遍历 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? / ...

  5. LeetCode 94. 二叉树的中序遍历(Binary Tree Inorder Traversal)

    题目描述 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 解题思路 由于 ...

  6. Leetcode 94. 二叉树的中序遍历

    1.问题描述 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 2.解法一 ...

  7. leetcode 94二叉树的中序遍历

    递归算法C++代码: /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; ...

  8. 【leetcode 94. 二叉树的中序遍历】解题报告

    前往二叉树的:前序,中序,后序 遍历算法 方法一:递归 vector<int> res; vector<int> inorderTraversal(TreeNode* root ...

  9. LeetCode 94 ——二叉树的中序遍历

    1. 题目 2. 解答 2.1. 递归法 定义一个存放树中数据的向量 data,从根节点开始,如果节点不为空,那么 递归得到其左子树的数据向量 temp,将 temp 合并到 data 中去 将当前节 ...

随机推荐

  1. jQuery 源码分析(十二) 数据操作模块 html特性 详解

    jQuery的属性操作模块总共有4个部分,本篇说一下第1个部分:HTML特性部分,html特性部分是对原生方法getAttribute()和setAttribute()的封装,用于修改DOM元素的特性 ...

  2. shell 命令 tar -zxvf 解压 tar -zcvf 压缩

    tar -zxvf 解压 tar -zcvf 压缩

  3. Spring Boot2 系列教程(二十二)整合 MyBatis 多数据源

    关于多数据源的配置,前面和大伙介绍过 JdbcTemplate 多数据源配置,那个比较简单,本文来和大伙说说 MyBatis 多数据源的配置. 其实关于多数据源,我的态度还是和之前一样,复杂的就直接上 ...

  4. 黄聪:php一句代码让http跳转https

    //其他框架请加到入口某共公加载的文件中 //方法一 https状态 if(!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] == 'off'){ Head ...

  5. Java开发桌面程序学习(二)————fxml布局与控件学习

    JavaFx项目 新建完项目,我们的项目有三个文件 Main.java 程序入口类,载入界面并显示 Controller.java 事件处理,与fxml绑定 Sample.fxml 界面 sample ...

  6. vue-路由-显示名称

    显示名称 方式1: <div id="app"> <!-- 分析: --> <!-- 1. 我们要监听到 文本框数据的改变,这样才能知道 什么时候去拼 ...

  7. Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析

    Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析 说明:Java生鲜电商平台中,由于服务进行了拆分,很多的业务服务导致了请求的网络延迟与性能消耗,对应的这些问题,我们 ...

  8. sed文本处理

    1.基本概述 sed是一个流编辑器, 非交互式的编辑器,它一次处理一行内容. 处理时,把当前处理的行存储在临时缓冲区中,称* 为"模式空间"(pattern space) 接着用 ...

  9. iOS常用宏定义--实用

    在这里给大家分享一些常用的宏定义,喜欢的小伙伴可以直接在项目中使用(持续更新)!为了大家使用方便,请点击GitHub - 宏定义头文件下载 ! 1.获取屏幕宽度与高度 #define SCREEN_W ...

  10. ABP进阶教程11 - 小结

    点这里进入ABP进阶教程目录 效果预览 至此,ABP进阶教程的查询/分页/排序/导出/打印示例已完成,效果如下 登录 首页 办公室信息 院系信息 课程信息 教职员信息 学生信息 新增 修改 删除 查询 ...