LeetCode 94:二叉树的中序遍历 Binary Tree Inorder Traversal

简介: 题目:给定一个二叉树,返回它的中序 遍历。Given a binary tree, return the inorder traversal of its nodes' values.示例:输入: [1,null,2,3] 1 \ 2 / 3输出:...

题目:

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

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
在这里插入图片描述

目录
相关文章
|
7月前
|
Go 开发者 索引
【LeetCode 热题100】路径与祖先:二叉树中的深度追踪技巧(力扣33 / 81/ 153/154)(Go语言版)
本文深入探讨了LeetCode中四道关于「搜索旋转排序数组」的经典题目,涵盖了无重复和有重复元素的情况。通过二分查找的变形应用,文章详细解析了每道题的解题思路和Go语言实现代码。关键点包括判断有序区间、处理重复元素以及如何缩小搜索范围。文章还总结了各题的异同,并推荐了类似题目,帮助读者全面掌握二分查找在旋转数组中的应用。无论是初学者还是有经验的开发者,都能从中获得实用的解题技巧和代码实现方法。
311 14
|
8月前
|
算法 Go
【LeetCode 热题100】深入理解二叉树结构变化与路径特性(力扣104 / 226 / 114 / 543)(Go语言版)
本博客深入探讨二叉树的深度计算、结构变换与路径分析,涵盖四道经典题目:104(最大深度)、226(翻转二叉树)、114(展开为链表)和543(二叉树直径)。通过递归与遍历策略(前序、后序等),解析每题的核心思路与实现方法。结合代码示例(Go语言),帮助读者掌握二叉树相关算法的精髓。下一讲将聚焦二叉树构造问题,欢迎持续关注!
193 10
|
8月前
|
存储 算法 数据可视化
【二叉树遍历入门:从中序遍历到层序与右视图】【LeetCode 热题100】94:二叉树的中序遍历、102:二叉树的层序遍历、199:二叉树的右视图(详细解析)(Go语言版)
本文详细解析了二叉树的三种经典遍历方式:中序遍历(94题)、层序遍历(102题)和右视图(199题)。通过递归与迭代实现中序遍历,深入理解深度优先搜索(DFS);借助队列完成层序遍历和右视图,掌握广度优先搜索(BFS)。文章对比DFS与BFS的思维方式,总结不同遍历的应用场景,为后续构造树结构奠定基础。
379 10
|
8月前
|
Go
【LeetCode 热题100】路径与祖先:二叉树中的深度追踪技巧(力扣437 / 236 )(Go语言版)
本文深入探讨二叉树中路径与祖先问题,涵盖两道经典题目:LeetCode 437(路径总和 III)和236(最近公共祖先)。对于路径总和 III,文章分析了双递归暴力解法与前缀和优化方法,后者通过哈希表记录路径和,将时间复杂度从O(n²)降至O(n)。在最近公共祖先问题中,采用后序遍历递归查找,利用“自底向上”的思路确定最近公共祖先节点。文中详细解析代码实现与核心要点,帮助读者掌握深度追踪技巧,理解树结构中路径与节点关系的本质。这类问题在面试中高频出现,掌握其解法意义重大。
187 4
|
8月前
|
Go 索引 Perl
【LeetCode 热题100】【二叉树构造题精讲:前序 + 中序建树 & 有序数组构造 BST】(详细解析)(Go语言版)
本文详细解析了二叉树构造的两类经典问题:通过前序与中序遍历重建二叉树(LeetCode 105),以及将有序数组转化为平衡二叉搜索树(BST,LeetCode 108)。文章从核心思路、递归解法到实现细节逐一拆解,强调通过索引控制子树范围以优化性能,并对比两题的不同构造逻辑。最后总结通用构造套路,提供进阶思考方向,帮助彻底掌握二叉树构造类题目。
425 9
【LeetCode 31】104.二叉树的最大深度
【LeetCode 31】104.二叉树的最大深度
83 2
【LeetCode 29】226.反转二叉树
【LeetCode 29】226.反转二叉树
94 2
【LeetCode 28】102.二叉树的层序遍历
【LeetCode 28】102.二叉树的层序遍历
95 2
|
存储 算法
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
文章深入探讨了二叉树的层序遍历方法,并展示了如何通过队列实现层序遍历的算法逻辑,同时指出掌握层序遍历技巧可以帮助解决LeetCode上的多道相关题目。
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
【LeetCode 43】236.二叉树的最近公共祖先
【LeetCode 43】236.二叉树的最近公共祖先
129 0

热门文章

最新文章