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

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

时间:2024-11-06 21:08:33浏览次数:3  
标签:第十八天 None right val self 二叉 搜索 root left

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 = None
        self.result = float('inf')
    def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
        if root == None:
            return
        left = 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 = root
        right = 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 = None
        self.result = float('inf')
    def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
        if root == None:
            return
        left = self.getMinimumDifference(root.left)
        if self.pre !=None:
            self.result = min(self.result,abs(self.pre.val-root.val))
        self.pre = root
        right = 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.vec
        self.traversal(root)
        if len(vec)<2:
            return 0
        result = float('inf')
        for i in range(len(vec)-1):
            result = min(result,abs(vec[i]-vec[i+1]))
        return result
    def traversal(self,node):
        if node == None:
            return
        self.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.vec
        self.traversal(root)
        dic = dict()
        for i in range(len(vec)):
            dic[vec[i]] = dic.get(vec[i],0)+1
        result = []
        maxval = max(dic.values())
        for k,v in dic.items():
            if v ==maxval:
                result.append(k)
        return result

    def traversal(self,node):
        if node is None:
            return
        self.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 = None
        self.count = 0
        self.maxcount = 0
        self.result = []
    def findMode(self, root: Optional[TreeNode]) -> List[int]:
        self.traversal(root)
        return self.result
    def traversal(self,cur):
        if cur == None:
            return
        self.traversal(cur.left)
        if self.pre == None:
            self.count = 1
        elif self.pre.val == cur.val:
            self.count +=1
        else:
            self.count = 1

        if self.count == self.maxcount:
            self.result.append(cur.val)

        if self.count >self.maxcount:
            self.maxcount = self.count
            self.result = []
            self.result.append(cur.val)
        self.pre = cur
        self.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 = None
        self.count = 0
        self.maxcount = 0
        self.result = []
    def findMode(self, root: Optional[TreeNode]) -> List[int]:
        if root == None:
            return
        self.findMode(root.left)
        if self.pre == None:
            self.count = 1
        elif self.pre.val == root.val:
            self.count +=1
        else:
            self.count = 1

        if self.count == self.maxcount:
            self.result.append(root.val)

        if self.count >self.maxcount:
            self.maxcount = self.count
            self.result = []
            self.result.append(root.val)
        self.pre = root
        self.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.count
    self.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 = None

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        if root == None:
            return root
        if root==p or root == q:
            return root
        left = self.lowestCommonAncestor(root.left,p,q)
        right = self.lowestCommonAncestor(root.right,p,q)
        if left!=None and right != None:
            return root
        elif left==None and right != None:
            return right
        elif left!=None and right ==None:
            return left
        else:
            return None

3.2 本题小结

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

4 今日小结

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

标签:第十八天,None,right,val,self,二叉,搜索,root,left
From: https://www.cnblogs.com/csfy0524/p/18531043

相关文章

  • 红黑树:自平衡的二叉搜索树
    简介红黑树(Red-BlackTree)是一种自平衡的二叉搜索树,其中每个节点都有一个颜色属性,可以是红色或黑色。红黑树在计算机科学中被广泛用于各种应用,如关联数组、数据库和调度程序。它们提供了一种有效的方式来保持数据的有序性,同时在插入和删除操作中保持较低的时间复杂度。红黑树......
  • 数据结构树与二叉树
    语雀链接:https://www.yuque.com/g/wushi-ls7km/ga9rkw/qw8kwzxigbx61kxy/collaborator/join?token=2vdSjDBgJyJb0VSL&source=doc_collaborator#《树与二叉树》......
  • 实验4:二叉树的基本操作
    c++解释:new相当于malloc()函数,其他没有区别!点击查看代码#include<iostream>usingnamespacestd;structtree{ intdata; tree*light,*ture;};intjie,shen,maxx;//创建tree*chu(){ tree*head; head=newtree; cout<<"请输入数值:\n"; cin>&g......
  • bfs(宽度搜索遍历)
    当边权为1时候,用bfs解决最短路问题题目:走迷宫给定一个 n×m的二维整数数组,用来表示一个迷宫,数组中只包含 0或 1,其中 0 表示可以走的路,1 表示不可通过的墙壁。最初,有一个人位于左上角 (1,1) 处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。请问,该......
  • 度娘去搜索语法及示例
    度娘搜索语法是一套用于提高搜索效率和精确度的特定规则和指令,可以帮助用户更精准地找到所需信息。以下是一些常用的度娘搜索语法及其详细示例:限定在网页标题中:intitle:该语法可以限定搜索结果仅包含网页标题中的关键词。例如,输入“新疆intitle:雪菊”将返回所有标题中包含“雪菊......
  • elasticsearch 常用搜索总结
    match_all它不包含任何条件,通常用于返回索引中的所有文档GET/index/_search{"query":{"match_all":{}}}match用于执行全文本搜索。它可以对文本字段进行模糊匹配,支持分词器处理后的词项匹配GET/index/_search{"query":{"match":{......
  • 从模糊搜索到语义搜索的进化之路——探索 Chroma 在大模型中的应用价值
    目录从模糊搜索到语义搜索的进化之路——探索Chroma在大模型中的应用价值一、引言二、实现语义搜索的数据库Chroma1、语义搜索是什么2、Chroma语义搜索的原理三、如何在项目中应用Chroma1、Chroma的实际应用场景2、安装Chroma(python环境) 3、创建嵌入索引4、查......
  • 代码随想录算法训练营第十六天|leetcode513.找树左下角的值、leetcode112.路径总和、l
    1leetcode513.找树左下角的值题目链接:513.找树左下角的值-力扣(LeetCode)文章链接:代码随想录视频链接:怎么找二叉树的左下角?递归中又带回溯了,怎么办?|LeetCode:513.找二叉树左下角的值_哔哩哔哩_bilibili思路:就是用一个东西存储result,使用后续遍历,如果遇到了最深的那一个值,就......
  • 【算法】递归+深搜:106.从中序与后序遍历序列构造二叉树(medium)
    目录1、题目链接相似题目:2、题目3、解法函数头-----找出重复子问题函数体---解决子问题4、代码1、题目链接106.从中序与后序遍历序列构造二叉树(LeetCode)相似题目:105.从前序与中序遍历序列构造二叉树889.根据前序和后序遍历构造二叉树(LeetCode)2、题目3、解法......
  • 一款功能强大的开源文档管理系统,将物理文档转换为可搜索的在线档案,实现无纸化办公工具
    大家好,今天给大家分享一个开源的文档管理系统Paperless-ngx,旨在将物理文档转换为可搜索的在线档案,以实现无纸化办公和高效的文档管理。项目介绍Paperless-ngx是一个开源的文档管理系统,旨在帮助用户实现无纸化办公。它允许用户扫描、上传和存储文档,并且通过强大的索引和搜索......