首页 > 编程语言 >代码随想录算法训练营第二十一天| leetcode669. 修剪二叉搜索树、leetcode108.将有序数组转换为二叉搜索树、leetcode538.把二叉搜索树转换为累加树

代码随想录算法训练营第二十一天| leetcode669. 修剪二叉搜索树、leetcode108.将有序数组转换为二叉搜索树、leetcode538.把二叉搜索树转换为累加树

时间:2024-11-08 14:30:32浏览次数:1  
标签:None right val self 随想录 二叉 搜索 root left

1 leetcode669. 修剪二叉搜索树

题目链接:669. 修剪二叉搜索树 - 力扣(LeetCode)

文章链接:代码随想录

视频链接:你修剪的方式不对,我来给你纠正一下!| LeetCode:669. 修剪二叉搜索树_哔哩哔哩_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 trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:
        if root==None:
            return None
        if root.val<low:
            return root.right
        elif root.val>high:
            return root.left
        root.left = self.trimBST(root.left,low,high)
        root.right = self.trimBST(root.right,low,high)
        return root

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 trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:
        if root==None:
            return None
        if root.val<low:
            right = self.trimBST(root.right,low,high)
            return right
        elif root.val>high:
            left =self.trimBST(root.left,low,high)
            return left
        root.left = self.trimBST(root.left,low,high)
        root.right = self.trimBST(root.right,low,high)
        return root

1.3 本题小结

  1. 这道题自己尝试的时候就是没考虑如果在他的左边的右边有不满足要求的值或者右边的左边有不符合要求的值应该怎么办,考虑了以后就是正确的

2 leetcode108.将有序数组转换为二叉搜索树

题目链接:108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)

文章链接:代码随想录

视频链接:你修剪的方式不对,我来给你纠正一下!| LeetCode:669. 修剪二叉搜索树_哔哩哔哩_bilibili

思路:有一种用了之前的裁剪方式,但是这里自己写的时候也报错了一点,注意就是终止条件要写,不然会有类似于死循环的感觉吧

2.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 sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
        if len(nums)==0:
            return
        middle_num = len(nums)//2
        val = nums[middle_num]
        node = TreeNode(val)
        left_num = nums[:len(nums)//2]
        right_num = nums[len(nums)//2+1:]
        node.left = self.sortedArrayToBST(left_num)
        node.right = self.sortedArrayToBST(right_num)
        return node

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 sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
        root= self.traversal(nums,0,len(nums)-1)
        return root
    def traversal(self,num,left,right):
        if left>right:
            return None

        mid = left +(right-left)//2
        root = TreeNode(num[mid])
        root.left = self.traversal(num,left,mid-1)
        root.right = self.traversal(num,mid+1,right)
        return root

2.3 本题小结

  1. 这种题目,感觉还是要多些,自己看的时候就觉得真的已经掌握挺好的了,自己一动手写,上来就写错了
  2. 主要还是数组里面指针的掌握还没掌握的那么牢固

3 leetcode538.把二叉搜索树转换为累加树

题目链接:538. 把二叉搜索树转换为累加树 - 力扣(LeetCode)

文章链接:代码随想录

视频链接:普大喜奔!二叉树章节已全部更完啦!| LeetCode:538.把二叉搜索树转换为累加树_哔哩哔哩_bilibili

思路:这道题,我理解的是换一种遍历方式,有一种不知道怎么说的,就是先找到最大的那个数值,然后对其作为结点,上一个结点的值等于这个最大的加上自己的值,然后不断累加,最后得到一颗新的二叉树,叫累加数;但是呢,确实不知道怎么下手

3.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 = 0
    def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        if root==None:
            return
        self.convertBST(root.right)
        root.val +=self.pre
        self.pre = root.val
        self.convertBST(root.left)
        return root

3.2 本题小结

  1. 这道题主要是思路上面,要敢于下手,我想到了,但是不敢写,纠结了一下,觉得这种方式没学过,不科学不合理,然后决定看完视频在写,发现和我想的一样
  2. 要记住,勇敢的人先享受世界,呜呜呜呜呜呜

4 今日小结

  1. 这四道题,相对而言都比较容易了吧,突然发现之前觉得难的递归我也能明白一些了,有两道题也是自己尝试写出来了
  2. 感慨:勇敢的人先享受世界!!
  3. 二叉树的知识,在这一刻就结束啦,从普通二叉树到平衡二叉树再到后面的二叉搜索树,一步步进步,一步步从看视频写题目到自己可以写出来,进步是有的,但是可以写的更好,希望二刷的时候越来越顺利

标签:None,right,val,self,随想录,二叉,搜索,root,left
From: https://www.cnblogs.com/csfy0524/p/18535017

相关文章

  • 二叉树 (王道数据结构 C语言版)
    2004.11.04计算一颗给定二叉树的所有双分支节点个数编写把一个树的所有左右子树进行交换的函数求先序遍历中第k个结点的值(1<=k<=二叉树中的结点个数)#include<bits/stdc++.h>#defineintlonglong#defineendl'\n'usingnamespacestd;typedefstructBitnode{......
  • 代码随想录算法训练营第三十九天|Day39 动态规划
    198.打家劫舍视频讲解:https://www.bilibili.com/video/BV1Te411N7SXhttps://programmercarl.com/0198.%E6%89%93%E5%AE%B6%E5%8A%AB%E8%88%8D.html思路#definemax(a,b)((a)>(b)?(a):(b))introb(int*nums,intnumsSize){if(numsSize==0){re......
  • 代码随想录算法训练营第四十天|Day40 动态规划
    121.买卖股票的最佳时机视频讲解:https://www.bilibili.com/video/BV1Xe4y1u77qhttps://programmercarl.com/0121.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BA.html思路#definemax(a,b)((a)>(b)?(a):(b))#definemin......
  • 代码随想录算法训练营第二十天|leetcode235. 二叉搜索树的最近公共祖先、leetcode701.
    1leetcode235.二叉搜索树的最近公共祖先题目链接:235.二叉搜索树的最近公共祖先-力扣(LeetCode)文章链接:代码随想录视频链接:二叉搜索树找祖先就有点不一样了!|235.二叉搜索树的最近公共祖先_哔哩哔哩_bilibili思路:用之前一样的方法,哈哈哈哈哈,好处就是做出来了,但是我觉得需......
  • 二叉树的递归遍历和迭代遍历
    递归每次写递归,都按照这三要素来写,可以保证大家写出正确的递归算法!确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数,并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。确定终止条件:写完了递归算法,运行的时......
  • 洛谷题单指南-二叉堆与树状数组-P2827 [NOIP2016 提高组] 蚯蚓
    原题链接:https://www.luogu.com.cn/problem/P2827题意解读:初始n个数,每次取最大值x,根据u/v分成两部分:x*u/v,x-x*u/v,然后其余数都增加q,整个过程重复m次。输出有两类数据:第t,2t,3t...次取出的最大值;最后剩余的数第t,2t,3t...个,从大到小输出。解题思路:直观上,通过模拟法可以实......
  • 代码随想录算法训练营第九天|LeetCode151.翻转字符串里的单词、卡码网:55.右旋转字符串
    前言打卡代码随想录算法训练营第49期第九天︿( ̄︶ ̄)︿首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。今日题目LeetCode151翻转字......
  • 代码随想录算法训练营 day37 day38| 卡码网52.完全背包 518. 零钱兑换 II 377.
    学习资料:https://programmercarl.com/背包问题理论基础完全背包.html#算法公开课相比于01背包,完全背包中每个物品都可以无限次的放入组合:先遍历物品,再逆序遍历背包排列:先逆序遍历背包,再遍历物品学习记录卡码网52.携带研究资料(dp[i]代表当重量为i时的最大价值)点击查看代码n......
  • 验证二叉搜索树
    题目描述给你一个二叉树的根节点root,判断其是否是一个有效的二叉搜索树。有效二叉搜索树定义如下:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。98.验证二叉搜索树-力扣(LeetCode) 解题思......
  • 大语言模型是搜索匹配还是智能生成?
    随着人工智能技术的迅猛发展,尤其是大语言模型(如GPT-3、GPT-4等)的问世,许多人开始讨论这些模型到底是依靠“搜索匹配”还是“智能生成”来回答问题、生成文本。这个问题关系到大语言模型的本质及其应用前景,对AI的认知和使用也有深远影响。在辩论这一话题时,我们可以从以下几个方......