当前位置: 首页 > article >正文

【LeetCode 刷题】二叉树-深度优先遍历

此博客为《代码随想录》二叉树章节的学习笔记,主要内容为二叉树的深度优先遍历相关的题目解析。

文章目录

  • 144. 二叉树的前序遍历
    • 递归法
    • 迭代法
  • 94. 二叉树的中序遍历
    • 递归法
    • 迭代法
  • 145. 二叉树的后序遍历
    • 递归法
    • 迭代法

144. 二叉树的前序遍历

题目链接

递归法

class Solution:
    def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        def dfs(node: Optional[TreeNode]):
            if node is None:
                return
            res.append(node.val)
            dfs(node.left)
            dfs(node.right)
        
        res = []
        dfs(root)
        return res
  • 可以将判断节点为空的逻辑放在递归函数最开始,从而避免判断根节点以及左右子节点为空的逻辑

迭代法

class Solution:
    def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        res = []
        if root is None:
            return res
        stack = [root]
        while stack:
            node = stack.pop()
            res.append(node.val)
            if node.right: 
                stack.append(node.right)
            if node.left:
                stack.append(node.left)
        return res
  • 若栈不为空,每次从栈中弹出一个节点,并处理该节点,之后依次将右、左节点压入栈中(先右后左,由于栈的处理顺序是反的)
  • 代码最开始先判断跟节点是否为空;之后的遍历过程中,先判断节点是否存在右、左子节点,再压入栈中

94. 二叉树的中序遍历

题目链接

递归法

class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        def dfs(node: Optional[TreeNode]):
            if node is None:
                return
            dfs(node.left)
            res.append(node.val)
            dfs(node.right)
        
        res = []
        dfs(root)
        return res

迭代法

class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        res, stack = [], []
        cur = root
        while cur or stack:
            if cur:
                stack.append(cur)
                cur = cur.left
            else:
                cur = stack.pop()
                res.append(cur.val)
                cur = cur.right
        return res
  • 节点的访问顺序的处理顺序不一致(只有前序遍历是一致的),需要借助指针 cur访问节点,栈来处理节点
  • 将左节点依次入栈,直到为空,弹出栈顶元素进行处理,之后切换到右节点重复上述操作

145. 二叉树的后序遍历

题目链接

递归法

class Solution:
    def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        def dfs(node: Optional[TreeNode]):
            if node is None:
                return
            dfs(node.left)
            dfs(node.right)
            res.append(node.val)
            
        res = []
        dfs(root)
        return res

迭代法

class Solution:
    def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        res = []
        if root is None:
            return res
        stack = [root]
        while stack:
            node = stack.pop()
            res.append(node.val)
            if node.left:
                stack.append(node.left)
            if node.right:
                stack.append(node.right)
        res.reverse()
        return res
  • 类似于迭代法前序遍历,求出中、右、左的遍历结果,翻转结果列表即得到左、右、中的后续遍历结果

http://www.kler.cn/a/516289.html

相关文章:

  • JavaScript笔记APIs篇01——DOM获取与属性操作
  • AIGC浪潮下,图文内容社区数据指标体系如何构建?
  • OGG 19C 集成模式启用DDL复制
  • 代码随想录day1
  • 【2024 博客之星评选】请继续保持Passion
  • 快手SDK接入错误处理经验总结(WebGL方案)
  • Chromium 132 编译指南 Mac 篇(二)- 安装 Xcode
  • WPF-系统资源
  • 豆包MarsCode:小C点菜问题
  • 左/右侧边栏布局(Semi design)
  • FPGA实现任意角度视频旋转(二)视频90度/270度无裁剪旋转
  • react antd点击table单元格文字下载指定的excel路径
  • Conmi的正确答案——Rider中引入WebView2包(C#)
  • Django 日志配置实战指南
  • .NET 9 微软官方推荐使用 Scalar 替代传统的 Swagger
  • 【项目初始化】自定义异常处理
  • 终极的复杂,是简单
  • PVE 虚拟机安装 Debian 无图形化界面服务器
  • 【后端开发】字节跳动青训营之Go语言进阶与依赖管理
  • Elementor Pro 3.27 汉化版 2100套模板 安装教程 wordpress主题中文编辑器插件免费下载
  • 缓存-Redis-数据结构-redis哪些数据结构是跳表实现的?
  • Node.js的解释
  • Charles 4.6.7 浏览器网络调试指南:基本界面与操作(二)
  • Vue 全局自适应大小:使用 postcss-pxtorem
  • [MySQL]数据类型以及表的属性与操作大全
  • linux虚拟机连接不上Xshell