题目:

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

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. 通过组件实现相同group下字符串拼接

    实现效果 组件处理流程如下:         1 使用Sorter组件对ColA进行排序       2 使用expression组件进行如下配置 3 使用aggregate组件进行如下配置 ColA ...

  2. 《细说PHP》第四版 样章 第23章 自定义PHP接口规范 4

    23.2.3  在程序中访问接口 本节再优化userapi.php文件中的代码,并多加一个接口函数store(), 模拟一个表单,通过POST提交数据给它,验证并将数据添加到数据库中,代码如下所示: ...

  3. tensorflow slim代码使用

    此处纯粹作为个人学习使用,原文连接:https://www.jianshu.com/p/dc24e54aec81 这篇文章是借鉴很多博文的,作为一个关于slim库的总结 导入slim模块 import ...

  4. 盘点10个CAD难点,看看有没有让你崩溃的,解决方法一并奉上

    蜀道难,难于上青天”,对于很多学习CAD的小伙伴来说CAD就跟蜀道一样,太难了,下面小编分享几个在学习CAD过程中会遇到的问题以及解决的方法,一起来看看吧! 1. 如何替换找不到的原文字体? 答:复制 ...

  5. css文本超出部分用省略号表示

    以前我在面试中遇到过这个问题,当时没答上来,现在回答一下: 1.设置三个属性: overflow:hidden   (超出部分隐藏) white-space:nowrap    (强制不换行) tex ...

  6. ABP进阶教程2 - 组合查询

    点这里进入ABP进阶教程目录 更新数据传输对象 打开应用层(即JD.CRS.Application)的Course\Dto\GetAllCoursesInput.cs //Course数据传输对象(查 ...

  7. Ubuntu18.04安装Cuda10.1

    注:如果使用anaconda,貌似不需要手动安装Cuda和cudnn,安装tensorflow时会自动安装 1.官方教程https://docs.nvidia.com/cuda/cuda-instal ...

  8. Linux(二)-- Linux配置及指令

    一.linux中常用软件的安装 yum install -y bash-completion vim lrzsz wget expect net-tools nc nmap tree dos2unix ...

  9. [视频教程] ubuntu系统下安装最新版的MySQL

    视频地址: https://www.bilibili.com/video/av69256331/ 官网文档https://dev.mysql.com/doc/mysql-apt-repo-quick- ...

  10. Es6编程风格

    let 取代 var let 和 const 之间优先使用 const 字符串 静态字符串一律使用单引号或反引号,不使用双引号 动态字符串使用反引号 `` 解构赋值 使用数组成员对变量赋值时,优先使用 ...