leetcode hot100 94. 二叉树的中序遍历 easy 递归 dfs


中序遍历(Inorder Traversal):左 - 根 - 右

这意味着对于每一棵子树,

  1. 先访问左子树
  2. 然后访问根节点
  3. 最后访问右子树。

递归解法(最直观)

既然是"左-根-右",就按照这个顺序调用函数即可

原题inorderTraversal函数定义是:

输入:一个根节点。

输出:一个 列表 List[int]

直接调用 self.inorderTraversal(root.left),它会返回一个完整的列表。

而我们只是想把数字填到一个公共的盒子(res)里,而不是每次都造一个新盒子。

辅助函数 inorderdfs 的作用就是: 它不返回列表,它只负责干活(把值 append 到外面的 res 列表里)。

python 复制代码
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:

        res = []

        def inorderdfs(node):
            if not node:
                return None
            
            # 递归
            inorderdfs(node.left)   # 左子树
            res.append(node.val)  # 根节点
            inorderdfs(node.right)  # 右子树

        inorderdfs(root)
        return res       
        

时间复杂度:O(n)O(n)O(n) 。每个节点都会被访问且仅被访问一次。
空间复杂度:O(n)O(n)O(n) 。在最坏情况下(树呈链状),递归深度或栈的高度会达到 nnn。

自底向上

程序是一直钻到最深的左节点,然后才开始收集第一个数字。这给人一种"从最底层开始处理"的感觉。

python 复制代码
dfs(node.left)     # 1. 钻到底
res.append(node.val) # 2. 出来时再捡起路上的果实
dfs(node.right)    # 3. 转向
相关推荐
nananaij14 分钟前
【LeetCode-02 最小偶倍数 python解法】
python·算法·leetcode
im_AMBER19 分钟前
Leetcode 139 最后一个单词的长度 | 找出字符串中第一个匹配项的下标
开发语言·算法·leetcode
Frostnova丶21 分钟前
(6)LeetCode.42 接雨水
数据结构·算法·leetcode
x_xbx25 分钟前
LeetCode:102. 二叉树的层序遍历
算法·leetcode
月明长歌37 分钟前
【码道初阶-Hot100】LeetCode 128. 最长连续序列:从排序双指针扫描到 HashSet,一文讲透为什么 O(n) 解法要用哈希
算法·leetcode·哈希算法
Trouvaille ~1 小时前
【贪心算法】专题(六):降维打击与错位重构的终极收官
c++·算法·leetcode·面试·贪心算法·重构·蓝桥杯
阿里嘎多哈基米1 小时前
速通Hot100-Day07——栈
数据结构·算法·leetcode··队列·hot100
一叶落4381 小时前
LeetCode 135. 分发糖果(C语言)| 贪心算法 + 双向遍历详解
c语言·数据结构·算法·leetcode·贪心算法·哈希算法
努力学算法的蒟蒻1 小时前
day113(3.15)——leetcode面试经典150
算法·leetcode·职场和发展
一叶落4382 小时前
LeetCode 42. 接雨水(C语言详解)——双指针经典解法
c语言·数据结构·c++·算法·leetcode