题目:

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

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. Docker - 卷组管理(三)

    一.不指定宿主机目录 首先运行一个nginx容器 docker run -d --name mynginx -p 8080:80 -v /usr/share/nginx/html nginx --na ...

  2. Token ,Cookie、Session傻傻分不清楚?

    作者 | 王菜鸟1993 来源 | cnblogs.com/JamesWang1993/p/8593494.html 在做接口测试时,经常会碰到请求参数为token的类型,但是可能大部分测试人员对to ...

  3. WPF 程序员休息数字时钟

    由于,程序员工作压力较大,上周996.ICU项目也非常火,为了让程序员开发者注重休息,特意写了一个休眠时钟,启动程序默认会倒计时3分钟. 效果图: 程序支持自定义休息时间,通过命令行参数执行,例如: ...

  4. java基础(12):构造方法、this、super

    1. 构造方法 我们对封装已经有了基本的了解,接下来我们来看一个新的问题,依然以Person为例,由于Person中的属性都被private了,外界无法直接访问属性,必须对外提供相应的set和get方 ...

  5. java基础(28):数据库、表及表数据、SQL语句

    1. 数据库 1.1 数据库概述 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作. 什么是数据库 ...

  6. 如何利用python爬取网易新闻

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: LSGOGroup PS:如有需要Python学习资料的小伙伴可以 ...

  7. layui 学习笔记一:layui table 查询、新增、编辑、删除

    一.table数据的呈现(对应查询) 页面代码: @{ ViewBag.Title = "TableGrid"; } @section styles{ <link href= ...

  8. 究竟是什么毁了我的impl实现

    Impl模式早就有过接触(本文特指通过指针完成impl),我晓得它具有以下优点: 减少头文件暴露出来的非必要内部类(提供静态库,动态库时尤其重要): 减小文件间的编译依存关系,大型代码库的编译时间就不 ...

  9. ubuntu安装cairo

    查看网上大神们的各种安装经过,最后google之后执行下面两句就搞定了:apt-get install python-cairo      apt-get install libcairo2

  10. JavaScript—字符串(String)用法

    字符串(String)去除空格 str = " hello python " // 去除左空格: str=str.replace( /^\s*/, ''); // 去除右空格: s ...