【力扣hot100】刷题笔记Day14

前言

  • 又是新的一周,快乐的周一,快乐地刷题,今天把链表搞完再干活!

114. 二叉树展开为链表 - 力扣(LeetCode)

  • 前序遍历

    • class Solution:def flatten(self, root: Optional[TreeNode]) -> None:if not root:returnst = [root]pre = Nonewhile st:cur = st.pop()# 把当前遍历结点接到上一个遍历结点上if pre:pre.left = Nonepre.right = cur  if cur.right:st.append(cur.right)if cur.left:st.append(cur.left)pre = curreturn root
      
  • 前驱结点

    • class Solution:def flatten(self, root: Optional[TreeNode]) -> None:cur = rootwhile cur:pre = curif cur.left:cur = cur.leftwhile cur.right:cur = cur.right  # cur指向pre左子树的最右(前驱)cur.right = pre.right  # pre右子树接在前驱上pre.right = pre.left  # pre左子树移到右子树pre.left = None  # pre左指针置为Nonecur = pre.right  # cur继续往右return root

105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)

  • 递归:复制数组O(n2)

    • class Solution:def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:if not preorder:return Noneroot = TreeNode(preorder[0])  # 构造根节点idx = inorder.index(preorder[0])  # 找到根节点在中序中的idx,O(n)root.left = self.buildTree(preorder[1: idx+1], inorder[0: idx])  # 递归构造左子树root.right = self.buildTree(preorder[idx+1:], inorder[idx+1:])   # 递归构造右子树return root
  • 递归:数组下标+哈希O(n)

    •  

    • class Solution:def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:def dfs(i, l, r):if r - l < 0:return None  # 子树区间为空时终止root = TreeNode(preorder[i])  # 初始化根节点m = inorder_map[preorder[i]]  # 查询 m ,从而划分左右子树root.left = dfs(i + 1, l, m - 1)  # 子问题:构建左子树root.right = dfs(i + 1 + m - l, m + 1, r)  # 子问题:构建右子树return root      # 回溯返回根节点# 初始化哈希表,存储 inorder 元素到索引的映射inorder_map = {val: i for i, val in enumerate(inorder)}root = dfs(0, 0, len(inorder) - 1)return root
  • 迭代

    • 比较难理解和模拟,可以只记上面的递归方法即可,参考官解
    • class Solution:def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:if not preorder:return Noneroot = TreeNode(preorder[0])stack = [root]inorderIndex = 0for i in range(1, len(preorder)):preorderVal = preorder[i]node = stack[-1]if node.val != inorder[inorderIndex]:node.left = TreeNode(preorderVal)stack.append(node.left)else:while stack and stack[-1].val == inorder[inorderIndex]:node = stack.pop()inorderIndex += 1node.right = TreeNode(preorderVal)stack.append(node.right)return root

 437. 路径总和 III - 力扣(LeetCode)

  • 双重递归

    • 两种方法思路参考题解
    • class Solution:# 求包含与不包含root的所有路径中满足要求的路径数def pathSum(self, root: TreeNode, sum: int) -> int:if not root:return 0return self.dfs(root, sum) + self.pathSum(root.left, sum) + self.pathSum(root.right, sum)# 求包含root的所有路径中满足要求的路径数    def dfs(self, root, path):if not root:return 0path -= root.valreturn (1 if path==0 else 0) + self.dfs(root.left, path) + self.dfs(root.right, path)
  •  前缀和 + 哈希

    • class Solution:def pathSum(self, root: Optional[TreeNode], targetSum: int) -> int:prefixSumTree = {0:1}  # 前缀和:个数self.count = 0  # 答案prefixSum = 0  # 记录当前前缀和self.dfs(root, sum, prefixSum, prefixSumTree)return self.countdef dfs(self, root, targetSum, prefixSum, prefixSumTree):if not root:return 0prefixSum += root.valoldSum = prefixSum - targetSum  # 之前可能存在的等于目标和的路径和=当前前缀和-目标和if oldSum in prefixSumTree:self.count += prefixSumTree[oldSum]  # 存在的话结果加上路径数prefixSumTree[prefixSum] = prefixSumTree.get(prefixSum, 0) + 1  # 如果不用collections.defaultdict,键不存在就返回默认值0,再+1self.dfs(root.left, targetSum, prefixSum, prefixSumTree)self.dfs(root.right, targetSum, prefixSum, prefixSumTree)'''一定要注意在递归回到上一层的时候要把当前层的prefixSum的个数-1,类似回溯,要把条件重置'''prefixSumTree[prefixSum] -= 1

 236. 二叉树的最近公共祖先 - 力扣(LeetCode)

  • 递归后序

    • class Solution:def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':if not root or root == p or root == q:return rootleft = self.lowestCommonAncestor(root.left, p, q)right = self.lowestCommonAncestor(root.right, p, q)if left and right: return root  # 找到祖先了if not left: return right   # 一边没有就返回另一边if not right: return left

 124. 二叉树中的最大路径和 - 力扣(LeetCode)

  • 递归后序

    • class Solution:def maxPathSum(self, root: Optional[TreeNode]) -> int:self.maxSum = -float('inf')  # 以防路径是负值# 递归计算左右子节点的最大贡献值def maxGain(node):if not node:return 0leftGain = maxGain(node.left)    # 左贡献rightGain = maxGain(node.right)  # 右贡献newPath = leftGain + rightGain + node.val  # 最大路径 = 左右贡献值+当前值self.maxSum = max(self.maxSum, newPath)  # 更新答案return max(max(leftGain, rightGain) + node.val, 0)  # 返回贡献值,为负数就不贡献了maxGain(root)return self.maxSum   

 后言

  • 搞定二叉树咯,头好晕啊,肯定是天气冻的,晚上再简单干点活就可以玩耍咯

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

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

相关文章

回溯 Leetcode 51 N皇后

N皇后 Leetcode 51 学习记录自代码随想录 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所…

Linux —— 链接文件

硬链接 一般情况下&#xff0c;文件名和inode号码是"一一对应"关系&#xff0c;每个inode号码对应一个文件名。但是&#xff0c;Unix/Linux系统允许&#xff0c;多个文件名指向同一个inode号码。 这意味着&#xff0c;可以用不同的文件名访问同样的内容&#xff1b;对…

软件开发常见模型解析

软件开发常见模型解析 摘要&#xff1a;本文将为您详细介绍软件开发过程中常见的几种模型&#xff0c;包括瀑布模型、敏捷开发模型、螺旋模型、迭代模型和原型模型。通过了解这些模型的原理、优缺点&#xff0c;帮助您在不同的软件项目中选择最适合的开发模型。 一、引言 在…

【IC前端虚拟项目】inst_buffer子模块DS与RTL编码

【IC前端虚拟项目】数据搬运指令处理模块前端实现虚拟项目说明-CSDN博客 需要说明一下的是,在我所提供的文档体系里,并没有模块的DS文档哈,因为实际项目里我也不怎么写DS毕竟不是每个公司都和HISI一样对文档要求这么严格的。不过作为一个培训的虚拟项目,还是建议在时间充裕…

Docker技术概论(3):Docker 中的基本概念

Docker技术概论&#xff08;3&#xff09; Docker 中的基本概念 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://…

基于java+springboot女士电商平台系统源码+文档设计

基于javaspringboot女士电商平台系统源码文档设计 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源…

C语言----动态内存管理(2)

1.这里总结动态内存管理里面的错误 &#xff08;1&#xff09;使用malloc开辟空间以后直接赋值 这个就是malloc开辟失败返回空指针&#xff0c;直接给空指针赋值就是错误的&#xff0c; tip1:使用malloc开辟空间以后一定要判断是否为空 &#xff08;2&#xff09; 越界访问…

Python批量提取文件夹中图片的名称及路径到指定的.txt文件中

目录 一、代码二、提取效果 一、代码 import os# 定义要保存的文件名 file_name "TestImage/Image_Visible_Gray.txt"# 读取文件夹路径 folder_path "TestImage/Image_Visible_Gray"# 遍历文件夹中的所有文件 with open(file_name, "w") as f…

IO进程线程day1

编写链表&#xff0c;链表里面随便搞点数据&#xff0c;使用fprintf将链表中所有的数据保存到文件中&#xff0c;用fscanf读取文件中的数据写入链表中 #include <stdio.h> #include <stdlib.h>typedef struct Node {int data;struct Node* next; } Node;// 创建新…

可移植性(兼容性)测试指南

可移植性是指应用程序能够安装到不同的环境中&#xff0c;在不同的环境中使用&#xff0c;甚至可以移动到不同的环境中。当然&#xff0c;前两者对所有系统都很重要。就PC软件而言&#xff0c;鉴于操作系统、共存和互操作应用程序、硬件、带宽可用性等方面的快速变化&#xff0…

抖店如何运营?新手应该怎么做?从入门到精通详细讲解!

我是电商珠珠 做抖店必须先搞懂它的基础流程&#xff0c;流程搞懂了&#xff0c;才能有进一步的可能。不要急功近利&#xff0c;想要一口吃个胖子&#xff0c;这样做就会直接造成店铺被清店&#xff0c;扣除保证金&#xff0c;甚至还会埋怨自己没用。 我做电商已经三年多的时…

vue3 日期延后一天

问题&#xff1a;提交信息时要求将所选日期延后一天进行提交解决过程&#xff1a;1.定义延后一天的计算方法&#xff0c;在提交前&#xff0c;将提交日期传入调用该方法 2.对延后的日期进行格式化&#xff0c;最后格式为yy-mm-dd解决结果&#xff1a; const…

c++ - pointer convert - class member function‘s pointer <==> void*

文章目录 c - pointer convert - class member functions pointer <> void*概述笔记END c - pointer convert - class member function’s pointer <> void* 概述 想将结构体中的void指针赋值为类成员函数的指针, 用于回调. 这个结构体相关的函数写完, 就不用再因…

Stable Diffusion中的Clip模型

基础介绍 Stable Diffusion 是一个文本到图像的生成模型&#xff0c;它能够根据用户输入的文本提示&#xff08;prompt&#xff09;生成相应的图像。在这个模型中&#xff0c;CLIP&#xff08;Contrastive Language-Image Pre-training&#xff09;模型扮演了一个关键的角色&a…

Biotin aniline,生物素苯胺,用于研究蛋白质结构和功能

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;769933-15-5&#xff0c;Biotin aniline&#xff0c;生物素苯胺&#xff0c;Biotin-aniline&#xff0c;生物素-苯胺 一、基本信息 【产品简介】&#xff1a;Biotin aniline is composed of three parts: biotin, w…

个人或者小团队选择C语言还是c++?

个人或者小团队选择C语言还是c? 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C语言的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff0…

使用Python语言实现一个基于动态数组的序列队列

一、动态数组的实现 首先&#xff0c;我们需要创建一个DynamicArray类&#xff0c;该类将管理我们的动态数组。 动态数组能够动态地调整其大小&#xff0c;以容纳更多的元素。 目录 一、动态数组的实现 代码示例&#xff1a; 二、序列队列的实现 接下来&#xff0c;我…

学习JAVA的第八天(基础)

目录 多态 前提 形式 测试类 调用成员的特点 优势 劣势 包 注意事项&#xff1a; final关键字 常量 命名规范&#xff1a; 注意事项&#xff1a; 权限修饰符 分类 代码块 局部代码块 构造代码块 静态代码块 抽象类 抽象类&#xff1a; 定义格式 抽象…

代码随想录算法训练营第五天

● 自己看到题目的第一想法 242. 有效的字母异位词 方法&#xff1a; 方法一&#xff1a; 暴力法 1. 分别对s, t排序 2. 遍历s与t 判断s[i]!t[i] 返回 false 否则 返回true思路&#xff1a; 注意&#xff1a; 代码&#xff1a; bool cmp(char a, char b){return a<b;…

网站搭建的基本流程是什么?

网站搭建的基本流程是什么? 我们选择了白嫖雨云的二级域名 浏览器输入https://www.rainyun.com/z22_ 创建账号然后选择一个你喜欢的子域名我建议后缀选择ates.top的 选择自定义地址&#xff0c;类型选择cname 现在要选择记录值了&#xff0c;有a&#xff0c;aa&#xff0c;txt…