代码随想录算法训练营第十八天|leetcode530.二叉搜索树的最小绝对差、leetcode501.二叉搜索树中的众数、leetcode236. 二叉树的最近公共祖先

news/2024/11/6 21:20:07/文章来源:https://www.cnblogs.com/csfy0524/p/18531043

1 leetcode530.二叉搜索树的最小绝对差

题目链接:530. 二叉搜索树的最小绝对差 - 力扣(LeetCode)

文章链接:代码随想录

视频链接:你对二叉搜索树了解的还不够! | LeetCode:98.验证二叉搜索树_哔哩哔哩_bilibili

思路:定义一个极大值作为结果,然后在中序遍历过程中进行比较出结果

1.1 自己的代码

# 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 __init__(self):self.pre = Noneself.result = float('inf')def getMinimumDifference(self, root: Optional[TreeNode]) -> int:if root == None:returnleft = self.getMinimumDifference(root.left)if self.pre !=None and abs(self.pre.val-root.val)<self.result:self.result = abs(self.pre.val-root.val)self.pre = rootright = self.getMinimumDifference(root.right)return self.result    

1.2 视频的代码

看了以后发现自己的代码可以浅优化一下,优化了一步,运行速度有提高,其他的没变化

# 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 __init__(self):self.pre = Noneself.result = float('inf')def getMinimumDifference(self, root: Optional[TreeNode]) -> int:if root == None:returnleft = self.getMinimumDifference(root.left)if self.pre !=None:self.result = min(self.result,abs(self.pre.val-root.val))self.pre = rootright = self.getMinimumDifference(root.right)return self.result    

1.3 暴力搜索方法

# 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 __init__(self):self.vec = []def getMinimumDifference(self, root: Optional[TreeNode]) -> int:vec = self.vecself.traversal(root)if len(vec)<2:return 0result = float('inf')for i in range(len(vec)-1):result = min(result,abs(vec[i]-vec[i+1]))return resultdef traversal(self,node):if node == None:returnself.traversal(node.left)self.vec.append(node.val)self.traversal(node.right)

1.4 本题小结

  1. 本题思路和之前验证一棵树是不是二叉搜索树的方法一模一样,所以就是按照指针方法就去写了,最后发现答案和我所想的也是一模一样的
  2. 其他的没有特别难的地方吧

2 leetcode501.二叉搜索树中的众数

题目链接:501. 二叉搜索树中的众数 - 力扣(LeetCode)

文章链接:代码随想录

视频链接:不仅双指针,还有代码技巧可以惊艳到你! | LeetCode:501.二叉搜索树中的众数_哔哩哔哩_bilibili

思路:想用一个数组去顺序存储二叉树的数值,然后将数组进行一个键值对的计算,键为数组的值,值为出现的次数,最后返回值最大的数

2.1 自己的代码

这个版本听冗余的,但是几个自己出错的点学会了

  1. 找键对应的最大值,可以直接使用max(dic.values())
  2. 使用键值循环的时候,用的是for key,value in dic.items()
# 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 __init__(self):self.vec = []def findMode(self, root: Optional[TreeNode]) -> List[int]:vec = self.vecself.traversal(root)dic = dict()for i in range(len(vec)):dic[vec[i]] = dic.get(vec[i],0)+1result = []maxval = max(dic.values())for k,v in dic.items():if v ==maxval:result.append(k)return resultdef traversal(self,node):if node is None:returnself.traversal(node.left)self.vec.append(node.val)self.traversal(node.right)

2.2 看视频后的思路

很多时候很难想到到底要不要几个值,还有最大值我该怎么给?就是在这两个地方卡壳了,没有用这种方式写出来代码

2.2.1 定义一个新函数

写错的原因

  1. 忘记给self.pre=cur
# 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 __init__(self):self.pre = Noneself.count = 0self.maxcount = 0self.result = []def findMode(self, root: Optional[TreeNode]) -> List[int]:self.traversal(root)return self.resultdef traversal(self,cur):if cur == None:returnself.traversal(cur.left)if self.pre == None:self.count = 1elif self.pre.val == cur.val:self.count +=1else:self.count = 1if self.count == self.maxcount:self.result.append(cur.val)if self.count >self.maxcount:self.maxcount = self.countself.result = []self.result.append(cur.val)self.pre = curself.traversal(cur.right)
2.2.2 直接在主函数进行
# 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 __init__(self):self.pre = Noneself.count = 0self.maxcount = 0self.result = []def findMode(self, root: Optional[TreeNode]) -> List[int]:if root == None:returnself.findMode(root.left)if self.pre == None:self.count = 1elif self.pre.val == root.val:self.count +=1else:self.count = 1if self.count == self.maxcount:self.result.append(root.val)if self.count >self.maxcount:self.maxcount = self.countself.result = []self.result.append(root.val)self.pre = rootself.findMode(root.right)return self.result

2.3 本题小结

  1. 注意中序遍历最后需要将值root赋值过去,这里写错了
  2. 一个很巧妙的办法就是对数据进行判断,这里我真的没想到,看完视频后才发现这个办法真的很巧妙;附上代码
if self.count == self.maxcount:self.result.append(root.val)if self.count >self.maxcount:self.maxcount = self.countself.result = []self.result.append(root.val)

3 leetcode236. 二叉树的最近公共祖先

题目链接:236. 二叉树的最近公共祖先 - 力扣(LeetCode)

文章链接:代码随想录

视频链接:自底向上查找,有点难度! | LeetCode:236. 二叉树的最近公共祖先_哔哩哔哩_bilibili

思路:好的,这是一个我看都看不懂的题目,更别说来写这道题目了

3.1 视频后的思路

突然发现自己做题目,真的分析的不够深,就是手头看了一下,不知道怎么写就有种放弃了,但是听完视频以后我可以完全独立写完整个代码

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution:def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':if root == None:return rootif root==p or root == q:return rootleft = self.lowestCommonAncestor(root.left,p,q)right = self.lowestCommonAncestor(root.right,p,q)if left!=None and right != None:return rootelif left==None and right != None:return rightelif left!=None and right ==None:return leftelse:return None

3.2 本题小结

  1. 从这道题很明显感受就是我对遍历的选择,用什么方式掌握的不是很牢固,所以会有经常出错的时候,但是每次看完视频讲解以后,我就会有一种豁然开朗的感觉
  2. 但是这里想说一下自己的进步吧,感觉到这个时候我的迭代方法是真的慢慢理解了,为什么会有这个,为什么要去使用,,,

4 今日小结

  1. 这里面前两道题其实延续了十七天的内容,所以理论上都是非常简单的,尝试一下就会出结果
  2. 主要困难的地方在于第三题,我没理解真的没理解这个值的前一个怎么返回,后来发现不断向上传递就是一个非常不错的办法就可以解决了
  3. 真不错,虽然这一天也是补的打卡,但是我一次性补了两天的内容,很棒

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

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

相关文章

基于Azure DevOps 的 CICD 项目部署(.Net Core)

使用微软的 来进行CICD 链接:https://dev.azure.com 创建新项目3.创建项目名称4.选择仓库地址5.选择空模板6.创建代理池7.按照以下步骤把代理部署到服务器上8.连接你的服务器 9.创建新的文件夹 mkdir myange cd myagent 10.可通过链接下载文件 wget https://vstsagentpackage.…

2个月搞定计算机二级C语言——真题(9)解析

1. 前言 本篇我们讲解2个月搞定计算机二级C语言——真题92. 程序填空题 2.1 题目要求2.2 提供的代码 #include <stdio.h> double f1(double x) {return x * x; } double f2(double x, double y) {return x * y; } /**********found**********/ __1__ fun(int i, do…

【转载】TortoiseSVN怎么恢复到以前版本-恢复到以前版本的方法

原文链接:https://blog.csdn.net/hbiao68/article/details/131595214 SVN(Subversion)是一个版本控制系统,它允许用户跟踪文件的更改并回退到以前的版本。 第一步:进到到文件目录,右键点击【空白处】。 第二步:点击打开【TortoiseSVN】。 第三步:点击【更新至版本】。 …

如何在windows中安装达梦数据库?

前言 近年来,国产数据库越来越流行了,其中的原因大家也都知道。其中,我接触过的一款数据库就是达梦数据库。这个数据库的使用还是挺方便的。我知道最近有越来越多的小伙伴要开始国产化改造了,所以,对于达梦数据库这样的国产数据库,肯定想要了解很多知识的。所以,今天就来…

基于GA-PSO-SVM算法的混沌背景下微弱信号检测matlab仿真

1.算法运行效果图预览 (完整程序运行后无水印)svm参数取值对检测性能的影响: SVM,PSO,GA-PSO-SVM的检测性能对比: 2.算法运行软件版本 matlab2022a3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频,参考文献,说明文档)load GAPSO.mat %调用四个最优的参数 ta…

DBeaver如何快速格式化sql语句,真简单!

前言 我之前在使用DBeaver的时候,一直不知道其可以格式化sql语句,导致sql语句看起来比较杂乱,今天就来介绍下DBeaver如何格式化sql语句。 如何格式化sql语句 首先,我们打开一个sql窗口,在里面输入我们要查询的sql语句,如图所示。可以看到,此时sql语句是比较杂乱的。然后…

学习笔记(二十七):ArkUi-警告弹窗(AlertDialog)

概述: 警告弹窗,需要向用户提问或得到用户的许可。警告弹窗用来提示重要信息,但会中断当前任务,尽量提供必要的信息和有用的操作。 避免仅使用警告弹窗提供信息,用户不喜欢被信息丰富但不可操作的警告打断。 必选内容包含:标题、可选信息文本、最多3个按钮。 可选内容包含…

figure

figure 新知识:坐标隐写和Rot47编码 用010打开发现好长一串字符,全是小写字母和数字,感觉是十六进制最后那里看着是png文件头的十六进制的逆序,逆回去得到png图片有坐标,想起了用坐标画图,但是肯定不是,因为点太少了而且这个图大致算是画出来了 每个点前面有序号,先一个…

CSP2024 前集训:多校A层冲刺NOIP2024模拟赛18

前言 不知道咋回事儿?脑子里一直放歌。 然后 T3 空间给了 256,开了 256.23 死了。 T1 选彩笔 显然可以二分答案,所以现在有了 \(O(nv^3\log v)\) 的做法,去重后可以拿到 \(80pts\),发现直接三维前缀和就可以做到 \(O(v^3\log v)\)。点击查看代码 #include<bits/stdc++.…

实验3 类和对象 基础编程

实验一 task1.cpp#include "window.hpp" #include <iostream>using std::cout; using std::cin;void test() {Window w1("new window");w1.add_button("maximize");w1.display();w1.close(); }int main() {cout << "用组合类模…

别再被多线程搞晕了!一篇文章轻松搞懂 Linux 多线程同步!

别再被多线程搞晕了!一篇文章轻松搞懂 Linux 多线程同步!前言 大家有没有遇到过,代码跑着跑着,线程突然抢资源抢疯了?其实,这都是“多线程同步”在作怪。多线程同步是个老生常谈的话题,可每次真正要处理时还是让人头疼。这篇文章,带你从头到尾掌握 Linux 的多线程同步,…

『模拟赛』NOIP2024加赛2

『模拟赛记录』NOIP2024加赛2Rank 一直烂,什么时候触底反弹(A. 新的阶乘 赛时觉得线筛一遍同时统计每个质数的指数就做完了,然后本机怎么跑不进 1s,卡常卡了半个小时,最后没 T,但是 vector 炸了,70pts。 可以换思路考虑,赛时一直没转换过来。对于每个质数枚举其倍数统计…