【CV炼丹师勇闯力扣训练营 Day13:§6二叉树1】

news2024/10/7 4:31:13

CV炼丹师勇闯力扣训练营

代码随想录算法训练营第13天
二叉树的递归遍历
二叉树的迭代遍历、统一迭代
二叉树的层序遍历


一、二叉树的递归遍历(深度优先搜索)

【递归步骤】
1.确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。
2.确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。
3.确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程

代码如下(Python):二叉树的前/中/后序遍历

from typing import List

# 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

# 前序遍历-递归-LC144_二叉树的前序遍历
class Solution:
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        res = []

        def dfs(node):
            if node is None:
                return

            res.append(node.val)
            dfs(node.left)
            dfs(node.right)

        dfs(root)
        return res


# 中序遍历-递归-LC94_二叉树的中序遍历
class Solution2:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        res = []

        def dfs(node):
            if node is None:
                return

            dfs(node.left)
            res.append(node.val)
            dfs(node.right)

        dfs(root)
        return res


# 后序遍历-递归-LC145_二叉树的后序遍历
class Solution3:
    def postorderTraversal(self, root: TreeNode) -> List[int]:
        res = []

        def dfs(node):
            if node is None:
                return

            dfs(node.left)
            dfs(node.right)
            res.append(node.val)

        dfs(root)
        return res


"""  [1,2,4,5,3]
            1
           / \
          2   3
         / \
        4   5
"""
# 创建二叉树
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)



# 实例化Solution并进行前序遍历
solution = Solution()
result = solution.preorderTraversal(root)

# 打印前序遍历的结果
print(result)

二、二叉树的迭代遍历

三、二叉树的统一迭代

# Todo

四、二叉树的层序遍历(广度优先搜索)

层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。

需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。

而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。

从左到右遍历层序遍历二叉树动画如图:

代码如下(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 levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        if not root:
            return []
        queue = collections.deque([root])
        result = []
        while queue:
            level = []
            for _ in range(len(queue)):
                cur = queue.popleft()
                level.append(cur.val)
                if cur.left:
                    queue.append(cur.left)
                if cur.right:
                    queue.append(cur.right)
            result.append(level)
        return result



"""
递归法
"""
# 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 levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        if not root:
            return []

        levels = []

        def traverse(node, level):
            if not node:
                return

            if len(levels) == level:
                levels.append([])

            levels[level].append(node.val)
            traverse(node.left, level + 1)
            traverse(node.right, level + 1)

        traverse(root, 0)
        return levels

107.二叉树的层次遍历 II

给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

在这里插入图片描述

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class Solution:
    def levelOrderBottom(self, root: TreeNode) -> List[List[int]]:
        if not root:
            return []
        queue = collections.deque([root])
        result = []
        while queue:
            level = []
            for _ in range(len(queue)):
                cur = queue.popleft()
                level.append(cur.val)
                if cur.left:
                    queue.append(cur.left)
                if cur.right:
                    queue.append(cur.right)
            result.append(level)
        return result[::-1]
        

199. 二叉树的右视图

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
在这里插入图片描述

class Solution:
    def rightSideView(self, root: TreeNode) -> List[int]:
        if not root:
            return []

        q = collections.deque([root])
        right_view = []

        while q:
            level_size = len(q)
            for i in range(len(q)):
                node = q.popleft()

                if i == level_size - 1:
                    right_view.append(node.val)

                if node.left:
                    q.append(node.left)
                if node.right:
                    q.append(node.right)

        return right_view
        

637.二叉树的层平均值

给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10^(-5) 以内的答案可以被接受。

429.N叉树的层序遍历

515.在每个树行中找最大值

116.填充每个节点的下一个右侧节点指针

117.填充每个节点的下一个右侧节点指针II

104.二叉树的最大深度

111.二叉树的最小深度


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1871919.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

.NET 漏洞分析 | 某ERP系统存在SQL注入

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

戴尔笔记本重装系统?笔记本卡顿失灵?一键重装系统!

随着科技的快速发展,笔记本电脑已成为我们日常生活和工作中不可或缺的工具。然而,随着时间的推移,笔记本可能会遇到各种问题,如系统卡顿、失灵等。这时,重装系统往往是一个有效的解决方案。本文将详细介绍如何在戴尔笔…

程序员职业发展指南,如何选择适合自己的就业方向?

随着科技的发展和数字化时代的到来,程序员是IT行业中的热门职业。尤其是近几年移动互联网的迅速发展,IT人才更是紧缺,越来越多的人加入程序员这个行列。 从事程序员工作,如何接项目呢?YesPMP是一个专注于互联网外包的平…

历史的加速度:智人何时会迎来下一个版本?人类的命运与挑战

在《人类简史》中,尤瓦尔赫拉利主要探讨了人类的过去和发展历程,重点关注的是智人(Homo sapiens)。在他的续作《未来简史》中,他进一步探讨了未来人类的发展,并引入了“神人”(Homo deus&#x…

MySQL改密

这里写目录标题 更改登录密码:有权限账号能登录mysql中:有权限账号不能登录mysql中:mysql5.6版本命令mysql5.7版本命令修改密码8.0版本改完后: mysql登录不上了本机安装了5.6后,又安装了mysql8.0 更改登录密码&#xf…

如何做到高级Kotlin强化实战?(一)

高级Kotlin强化实战(一) 第一章 Kotlin 入门教程1.Kotlin 入门介绍2.Kotlin 与 Java 比较 第一章 Kotlin 入门教程 1.Kotlin 入门介绍 Kotlin 概述 Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言。它主要是 JetBrains 开发团队所开发出来的编程…

技术突破:llamafile一键部署大模型,释放AI潜力

目录 一、引言二、什么是llamafile?1、设计目标2、技术构成3、与传统部署方式的对比4、一键部署的优势 三、核心特性1、一键部署的便捷性2、跨平台支持3、独立可执行文件4、简化的分发流程5、技术细节6、用户体验7、安全性和隐私 四、部署流程详解1、下载模型2、操作…

Pytorch课程论文设计参考

Pytorch下基于卷积神经网络的手写数字识别 论文格式 利用wps初步美化论文格式教程 wps论文格式变的的原因 格式变的根本原因是word为流式文件,就算同是word同一个版本不同电脑也会有可能变,字体变是因为没有嵌入字体然后观看的那台没有这个字体。 一、…

「51媒体」企业举行新闻发布会,如何邀请媒体到场报道

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 媒体宣传加速季,100万补贴享不停,一手媒体资源,全国100城线下落地执行。详情请联系胡老师。 企业举行新闻发布会时,邀请媒体到场报道是一个…

2018年全国大学生数学建模竞赛A题高温服装设计(含word论文和源代码资源)

文章目录 一、部分题目二、部分论文三、部分Matlab源代码问题11 求解h1h22 已知h1h2求解温度分布 问题21 求解第二层最佳厚度 四、完整word版论文和源代码(两种获取方式) 一、部分题目 2018 年高教社杯全国大学生数学建模竞赛题目 A 题 高温作业专用服…

Linux CentOS 宝塔 Suhosin禁用php5.6版本eval函数详细图文教程

方法一:PHP_diseval_extension禁用 Linux CentOS 禁用php的eval函数详细图文教程_centos php 禁用 eval-CSDN博客 这个方法make报错,懒得费时间处理,直接用第二种 方法二:suhosin禁用 不支持PHP8,官方只支持PHP7以下…

RedisConnectionException: Unable to connect to localhost/<unresolved>:6379

方法一:删除配置密码选项 一般是因为你在启动redsi服务的时候没有以指定配置文件启动 把application.yml文件中的redis密码注释掉 方法二 以指定配置文件启动 这样就不用删除yml文件中密码的选项了 在redis,windows.conf 中找到requirepass,删除掉前…

基于SSM+Vue的宠物领养平台系统(带1w+文档)

基于SSMVue的宠物领养平台系统(带1w文档) 本课题研究和开发同城宠物帮管理系统,让安装在计算机上的该系统变成管理人员的小帮手,提高同城宠物帮信息处理速度,规范同城宠物帮信息处理流程,让管理人员的产出效益更高。 项目简介 基…

js或ts中对象如何循环遍历获取名字和值

数组循环有多种方法,但是对象循环还是会遇到一些问题 分开获取key或value let names{name:kaka,age:12}获取key值代码: Object.keys(names).forEach(name>{console.log(name) })结果: 获取value值代码: Object.values(name…

Java代码操作MySQL数据库——JDBC编程

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…

【面试干货】静态类型的特点及其在Java中的应用

【面试干货】静态类型的特点及其在Java中的应用 1、静态类型的特点1.1 静态属性1.2 静态方法1.3 静态类 2、静态类型在Java中的应用 💖The Begin💖点点关注,收藏不迷路💖 在面向对象编程中,静态类型 是一种重要的概念&…

C++之迭代器分类与List容器的使用

目录 迭代器的分类 List容器 ​编辑 总结 在Vector容器中我们学习了迭代器,知道了迭代器的作用和使用方法,本期我们将进一步学习迭代器的概念以及list容器的使用。 迭代器的分类 以算法库中的两个算法为例: sort算法是用来排序的&#…

kafka-高可用设计详解(集群架构、备份机制、消费者组、重平衡)

文章目录 kafka高可用设计集群架构Kafka集群选举ISR与OSRLEO和HWKafka分区Leader选举Leader Replica选举策略Leader Replica选举过程 副本机制(Replication)消费者组和再均衡消费者组再均衡(重平衡) 更多相关内容可查看 kafka高可用设计 Apache Kafka 的高可用设计…

【Flink】Flink SQL

一、Flink 架构 Flink 架构 | Apache Flink 二、设置TaskManager、Slot和Parallelism 在Apache Flink中,设置TaskManager、Slot和Parallelism是配置Flink集群性能和资源利用的关键步骤。以下是关于如何设置这些参数的详细指南: 1. TaskManager 设置 …

SAME70硬件擦除flash方法(ATSAME70Q21B-ANT

1.PB12高电平,当PB12置低电平时,将擦除所有数据; 2.ATSAME70Q21B-ANT芯片通过Microchip Studio 7.0仿真器烧录的…elf和hex等文件,读取之后,再烧写,还是可以使用,故需要锁定芯片代码&#xff…