代码随想录学习Day 13

news/2024/7/20 21:36:35 标签: 学习, 算法, 深度优先

102.二叉树的层次遍历

题目链接

讲解链接

层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。而这种层序遍历方式就是图论中的广度优先遍历。

class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        if not root:
            return []
        result = []
        queue = deque([root])  # 向队列中存入根结点
        while queue:
            level = []  # level用于储存每一层的结点
            for _ in range(len(queue)):  # len(queue)为当前层中元素的数量
                node = queue.popleft()
                level.append(node.val)
                if node.left:  # 将左孩子加入队列
                    queue.append(node.left)
                if node.right:  # 右孩子加入队列
                    queue.append(node.right)
            result.append(level)  # for循环每次结束时,代表遍历完了一层的结点,此时将level添加到result中
        return result

226.翻转二叉树

题目链接

讲解链接

要实现二叉树的反转,其实就是把每一个节点的左右孩子交换一下即可。关键在于遍历顺序,前中后序以及层次遍历的选择。遍历的过程中去翻转每一个节点的左右孩子就可以达到整体翻转的效果。本题使用前序、后序和层次相对容易。

递归法:

class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        if not root:
            return None
        root.left, root.right = root.right, root.left  # 直接交换左右孩子
        self.invertTree(root.left)  # 左孩子递归调用
        self.invertTree(root.right)  # 右孩子递归调用
        return root  # 每次返回当前根节点

迭代法(前序遍历):

class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        if not root:
            return None
        stack = [root]
        while stack:
            node = stack.pop()
            node.left, node.right = node.right, node.left  # 与遍历的区别就是这步交换左右孩子
            if node.left:
                stack.append(node.left)
            if node.right:
                stack.append(node.right)
        return root  # 返回根结点

迭代法(层次遍历)

class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        if not root:
            return None
        queue = deque([root])
        while queue:
            for _ in range(len(queue)):
                node = queue.popleft()
                node.left, node.right = node.right, node.left
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
        return root

迭代法的代码与遍历的代码基本一致,仅需添加一句交换左右孩子即可。

101.对称二叉树

题目链接

讲解链接

一开始想到的做法是判断根节点的左子树和右子树的中序遍历顺序是否相同,如果相同则说明二叉树是对称的。这个做法可以涵盖大部分的情况,但在测试用例为图示的二叉树时会出错,因为在这种情况下左右子树的中序遍历顺序是相同的,但却并不对称。

正确思路:

判断对称二叉树要比较的是哪两个节点,要比较的不是左右节点!对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,所以其实要比较的是两个树(根节点的左右子树)。这里由于需要收集左右孩子的信息向上一层返回,所以必须采用后序遍历

class Solution:
    def compare(self, left, right):
        if not left and not right:  # 左右孩子均为空,则为对称
            return True
        elif left and not right:  # 左右孩子其中之一为空,另一个不为空,则为非对称
            return False
        elif not left and right:
            return False
        elif left.val != right.val:  # 左右孩子均不为空但值不相等,为非对称
            return False
        else:
            outside = self.compare(left.left, right.right)  # 外侧情况,对应后序遍历的左
            inside = self.compare(left.right, right.left)  # 内侧情况,对应后序遍历的右
            result = outside and inside  # 外侧和内侧均为True,则表明二叉树是对称的,对应中
        return result

    def isSymmetric(self, root: Optional[TreeNode]) -> bool:
        if not root:  # 空树是对称的
            return True
        result = self.compare(root.left, root.right)
        return result

http://www.niftyadmin.cn/n/5448235.html

相关文章

单元测试框架 Junit

目录 什么是Junit? Junit的基础注解有哪些? 什么是参数化?参数化通过哪几种方式传输数据? 单参数 多参数 CSV文件获取参数 方法获取参数 测试用例执行顺序如何控制? 什么是断言assert?Assertions类…

Day 30回溯06

332.重新安排行程 题目链接&#xff1a;332. 重新安排行程 - 力扣&#xff08;LeetCode&#xff09; class Solution {private Deque<String> res;//最后路径private Map<String, Map<String, Integer>> map;//机场映射&#xff0c;int来判断要使用目的地几次…

(简直神器)体验丝滑翻译网页:Open AI ChatGPT x 沉浸式翻译

最近发现 沉浸式翻译 这个 Chrome 插件&#xff0c;可以把网页里的内容丝滑在原位翻译&#xff08;同时还保留了英文原文&#xff09;&#xff0c;我尝试接入了 Open AI 的 ChatGPT API 之后&#xff0c;发现体验很好&#xff0c;速度挺快 & 翻译质量比 Google Translate 好…

前端基础篇-前端工程化 Vue 项目开发流程(环境准备、Element 组件库、Vue 路由、项目打包部署)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 环境准备 1.1 安装 NodeJs 1.2 验证 NodeJs 环境变量 1.3 配置 npm 的全局安装路径 1.4 切换 npm 的淘宝镜像( npm 使用国内淘宝镜像的方法(最新) ) 1.5 查看镜像…

#Linux系统编程(标准IO与文件IO简介与文件IO open函数)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09;文件IO与标准IO 文件IO&#xff1a;直接调用内核提供的系统调用函数 标准IO&#xff1a;间接调用内核的系统函数&#xff0c;是C库函数 &…

计算联合体union的大小

一&#xff1a;联合类型的定义 联合也是一种特殊的自定义类型&#xff0c;这种类型定义的变量也包含一系列的成员&#xff0c;特征是这些成员公用同一块空间&#xff08;所以联合也叫共用体&#xff09; 比如&#xff1a;共用了 i 这个较大的空间 二&#xff1a; 联合的特点 …

nginx localtion 匹配规则

1、语法规则 语法规则&#xff1a;location[|~|^~*|^~]/uri/{… } 表示精确匹配,这个优先级也是最高的 ^~ 表示 uri 以某个常规字符串开头&#xff0c;理解为匹配 url 路径即可。 nginx 不对 url 做编码&#xff0c;因此请求为 /image/20%/aa&#xff0c;可以被规则^~ /imag…

探索 Atlassian 云平台:组织、站点、产品架构解析

我们通常访问的是 Atlassian 的某个云站点&#xff0c;比如填空题-中国站点为&#xff1a;cloze-cn.atlassian.net。当我们访问该站点内的具体产品时&#xff0c;只需在该站点的 URL 后添加相应产品的缩写&#xff0c;例如&#xff1a; Confluence: cloze-cn.atlassian.net/wi…