【二叉树遍历入门:从中序遍历到层序与右视图】【LeetCode 热题100】94:二叉树的中序遍历、102:二叉树的层序遍历、199:二叉树的右视图(详细解析)(Go语言版)

简介: 本文详细解析了二叉树的三种经典遍历方式:中序遍历(94题)、层序遍历(102题)和右视图(199题)。通过递归与迭代实现中序遍历,深入理解深度优先搜索(DFS);借助队列完成层序遍历和右视图,掌握广度优先搜索(BFS)。文章对比DFS与BFS的思维方式,总结不同遍历的应用场景,为后续构造树结构奠定基础。

🌳 二叉树遍历入门:从中序遍历到层序与右视图

本文涵盖 LeetCode 上的三道基础但极具代表性的二叉树遍历题:

    1. 二叉树的中序遍历
    1. 二叉树的层序遍历
    1. 二叉树的右视图

通过这些题目,我们将从 DFS 到 BFS,深入理解如何处理树结构的不同维度信息。


🧩 题目一:94. 二叉树的中序遍历

📝 题目描述

给定一棵二叉树,返回它的中序遍历
中序遍历顺序:左子树 → 根节点 → 右子树


💡 解题思路

中序遍历是深度优先搜索(DFS)中的一种经典形式。我们可以通过递归(最自然)或迭代(更贴近底层执行过程)两种方式来完成。


✅ 解法一:递归

func inorderTraversal(root *TreeNode) []int {
   
    res := []int{
   }
    var dfs func(*TreeNode)
    dfs = func(node *TreeNode) {
   
        if node == nil {
   
            return
        }
        dfs(node.Left)
        res = append(res, node.Val)
        dfs(node.Right)
    }
    dfs(root)
    return res
}

🧠 思路总结

递归的核心是“做当前,交给子问题”,结构上非常清晰。


✅ 解法二:迭代(用栈模拟)

func inorderTraversal(root *TreeNode) []int {
   
    res := []int{
   }
    stack := []*TreeNode{
   }
    curr := root
    for curr != nil || len(stack) > 0 {
   
        for curr != nil {
   
            stack = append(stack, curr)
            curr = curr.Left
        }
        curr = stack[len(stack)-1]
        stack = stack[:len(stack)-1]
        res = append(res, curr.Val)
        curr = curr.Right
    }
    return res
}

📌 注意点:

  • 用一个 while 循环控制整体流程。
  • 用一个内嵌的 for 循环不断向左深入。
  • 弹栈后处理当前节点,再转向右子树。

🧩 题目二:102. 二叉树的层序遍历

📝 题目描述

返回一个按层次遍历(每一层从左到右)的节点值数组。


💡 解题思路

层序遍历就是经典的广度优先搜索(BFS),借助队列来完成逐层访问。


✅ 解法:使用队列 BFS

func levelOrder(root *TreeNode) [][]int {
   
    if root == nil {
   
        return [][]int{
   }
    }
    res := [][]int{
   }
    queue := []*TreeNode{
   root}
    for len(queue) > 0 {
   
        level := []int{
   }
        size := len(queue)
        for i := 0; i < size; i++ {
   
            node := queue[0]
            queue = queue[1:]
            level = append(level, node.Val)
            if node.Left != nil {
   
                queue = append(queue, node.Left)
            }
            if node.Right != nil {
   
                queue = append(queue, node.Right)
            }
        }
        res = append(res, level)
    }
    return res
}

📌 关键点:

  • 使用 queue 存储当前层的所有节点。
  • 通过 size 确定每层的边界。
  • 每层遍历完成后将其加入结果集。

🧩 题目三:199. 二叉树的右视图

📝 题目描述

从右侧观察一棵二叉树,返回你能看到的节点值。


💡 解题思路

本质还是 BFS,只不过我们只关心每一层的最后一个节点。


✅ 解法:BFS + 每层最后一个节点

func rightSideView(root *TreeNode) []int {
   
    if root == nil {
   
        return []int{
   }
    }
    res := []int{
   }
    queue := []*TreeNode{
   root}
    for len(queue) > 0 {
   
        size := len(queue)
        for i := 0; i < size; i++ {
   
            node := queue[0]
            queue = queue[1:]
            if i == size-1 {
   
                res = append(res, node.Val)
            }
            if node.Left != nil {
   
                queue = append(queue, node.Left)
            }
            if node.Right != nil {
   
                queue = append(queue, node.Right)
            }
        }
    }
    return res
}

📌 细节提示:

  • 每层的最后一个节点 i == size - 1 才加入结果。
  • 和层序遍历一样,使用 queue 来按层推进。

🧠 总结与反思

遍历类型 算法 数据结构 应用
中序遍历 DFS 栈 / 递归 搜索树性质、线索二叉树
层序遍历 BFS 队列 可视化结构、层级分析
右视图 BFS 队列 一层一个视角节点
  • DFS 与 BFS 的思维方式差异是树结构的关键入门点。
  • 掌握递归与迭代切换思维,对后续复杂结构建树、剪枝、遍历非常重要。

下一篇我们将探索如何通过遍历构造树结构(前序 + 中序 → 构造二叉树、数组 → 平衡搜索树等),敬请期待!

目录
相关文章
|
11月前
|
数据采集 数据挖掘 测试技术
Go与Python爬虫实战对比:从开发效率到性能瓶颈的深度解析
本文对比了Python与Go在爬虫开发中的特点。Python凭借Scrapy等框架在开发效率和易用性上占优,适合快速开发与中小型项目;而Go凭借高并发和高性能优势,适用于大规模、长期运行的爬虫服务。文章通过代码示例和性能测试,分析了两者在并发能力、错误处理、部署维护等方面的差异,并探讨了未来融合发展的趋势。
1163 0
|
9月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟蒋星熠Jaxonic,Go语言探索者。深耕云计算、微服务与并发编程,以代码为笔,在二进制星河中书写极客诗篇。分享Go核心原理、性能优化与实战架构,助力开发者掌握云原生时代利器。#Go语言 #并发编程 #性能优化
705 43
Go语言深度解析:从入门到精通的完整指南
|
10月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟 蒋星熠Jaxonic,执着的星际旅人,用Go语言编写代码诗篇。🚀 Go语言以简洁、高效、并发为核心,助力云计算与微服务革新。📚 本文详解Go语法、并发模型、性能优化与实战案例,助你掌握现代编程精髓。🌌 从goroutine到channel,从内存优化到高并发架构,全面解析Go的强大力量。🔧 实战构建高性能Web服务,展现Go在云原生时代的无限可能。✨ 附技术对比、最佳实践与生态全景,带你踏上Go语言的星辰征途。#Go语言 #并发编程 #云原生 #性能优化
|
9月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
11月前
|
缓存 监控 安全
告别缓存击穿!Go 语言中的防并发神器:singleflight 包深度解析
在高并发场景中,多个请求同时访问同一资源易导致缓存击穿、数据库压力过大。Go 语言提供的 `singleflight` 包可将相同 key 的请求合并,仅执行一次实际操作,其余请求共享结果,有效降低系统负载。本文详解其原理、实现及典型应用场景,并附示例代码,助你掌握高并发优化技巧。
777 0
【Go语言入门100题】026 I Love GPLT (5 分) Go语言 | Golang
L1-026 I Love GPLT (5 分) Go语言|Golang 这道超级简单的题目没有任何输入。 你只需要把这句很重要的话 —— “I Love GPLT”——竖着输出就可以了。 所谓“竖着输出”,是指每个字符占一行(包括空格),即每行只能有1个字符和回车。
798 0
|
存储 Go
【Go语言入门100题】023 输出GPLT (20 分) Go语言 | Golang
L1-023 输出GPLT (20 分) Go语言|Golang 给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按GPLTGPLT....这样的顺序输出,并忽略其它字符。当然,四种字符(不区分大小写)的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按GPLT的顺序打印,直到所有字符都被输出。 下面给出甲、乙两人的酒量(最多能喝多少杯不倒)和划拳记录,请你判断两个人谁先倒。
285 0
|
9月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
435 2
|
11月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
659 1
|
开发框架 JSON 中间件
Go语言Web开发框架实践:路由、中间件、参数校验
Gin框架以其极简风格、强大路由管理、灵活中间件机制及参数绑定校验系统著称。本文详解其核心功能:1) 路由管理,支持分组与路径参数;2) 中间件机制,实现全局与局部控制;3) 参数绑定,涵盖多种来源;4) 结构体绑定与字段校验,确保数据合法性;5) 自定义校验器扩展功能;6) 统一错误处理提升用户体验。Gin以清晰模块化、流程可控及自动化校验等优势,成为开发者的优选工具。

热门文章

最新文章