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

代码随想录算法训练营第23天 | 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

时间:2024-07-16 12:22:51浏览次数:15  
标签:right curr self 随想录 二叉 搜索 root left

代码随想录算法训练营第22天 | 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

  1. 修剪二叉搜索树:https://leetcode.cn/problems/trim-a-binary-search-tree/description/
    代码随想录:
    https://programmercarl.com/0669.修剪二叉搜索树.html#算法公开课
    108.将有序数组转换为二叉搜索树
    https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/
    代码随想录:
    https://programmercarl.com/0108.将有序数组转换为二叉搜索树.html#算法公开课
    538.把二叉搜索树转换为累加树
    https://leetcode.cn/problems/convert-bst-to-greater-tree/
    代码随想录:
    https://programmercarl.com/0538.把二叉搜索树转换为累加树.html

669. 修剪二叉搜索树

题解思路

  • 递归法:判断当前节点是否符合要求;删除当下节点;
  • 迭代法:(不需要用栈遍历)
    1. 将root移动至区间内
    2. 修剪左子树
    3. 修剪右子树
class Solution:
    def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:
        if not root:
            return root
        if root.val<low:
            root = root.right
            return self.trimBST(root,low,high)
        elif root.val>high:
            root = root.left
            return self.trimBST(root,low,high)
        root.left = self.trimBST(root.left,low,high)
        root.right = self.trimBST(root.right,low,high)
        return root
class Solution:
    def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:
        if not root:
            return root
        while root and root.val<low:
            root = root.right
        while root and root.val>high:
            root = root.left
        curr = root
        while curr:
            while curr.left and curr.left.val<low:
                curr.left = curr.left.right
            curr = curr.left

        curr = root
        while curr:
            while curr.right and curr.right.val>high:
                curr.right = curr.right.left
            curr = curr.right
        return root

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

题解思路

  • 平衡二叉树:从中间节点开始划分数组;
  • 递归法:每次选取中间节点、递归模拟赋值即可;
  • 迭代法:3个队列模拟选取节点和赋值的过程;

题解代码

递归法

class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
        if len(nums)==0:
            return None
        middle_nums = len(nums)//2
        node = TreeNode(nums[middle_nums])
        node.left = self.sortedArrayToBST(nums[:middle_nums])
        node.right = self.sortedArrayToBST(nums[middle_nums+1:])
        return node

迭代法

class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
        if len(nums)==0:
            return None
        root = TreeNode(0)
        node_que = collections.deque([root])
        left_que = collections.deque([0])
        right_que = collections.deque([len(nums)-1])

        while node_que:
            curr_node = node_que.popleft()
            left = left_que.popleft()
            right =right_que.popleft()
            mid = left+(right-left)//2
            curr_node.val = nums[mid]

            if left<=mid-1:
                curr_node.left = TreeNode(0)
                node_que.append(curr_node.left)
                left_que.append(left)
                right_que.append(mid-1)
            if right>=mid+1:
                curr_node.right = TreeNode(0)
                node_que.append(curr_node.right)
                left_que.append(mid+1)
                right_que.append(right)
        return root

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

题解思路

  • 递归法:先计算每个右子树。每个值等于前一个值累加;
  • 迭代法:
    • 采用栈 将所有右节点进入栈,依次遍历其左子树
    • 记录self.pre
class Solution:
    def __init__(self):
        self.pre = 0
    def trans(self,curr):
        if not curr:
            return None
        self.trans(curr.right)
        curr.val = curr.val+self.pre
        self.pre = curr.val
        self.trans(curr.left)
        return curr
    def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        if not root:
            return None
        return self.trans(root)
class Solution:
    def __init__(self):
        self.pre = 0

    def trans(self,root):
        if not root:
            return None

        st = []
        curr = root
        while st or curr:
            if curr:
                st.append(curr)
                curr = curr.right
            else:
                curr = st.pop()
                curr.val = curr.val+self.pre
                self.pre = curr.val
                curr = curr.left

    def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        self.trans(root)
        return root

标签:right,curr,self,随想录,二叉,搜索,root,left
From: https://www.cnblogs.com/P201821440041/p/18303661

相关文章

  • 数据结构(Java):力扣&牛客 二叉树面试OJ题
    目录1、题一:检查两棵树是否相同 1.1思路分析1.2代码2、题二:另一颗树的子树2.1思路分析 2.2代码3、题三:翻转二叉树3.1思路分析3.2代码4、题四:判断树是否对称4.1思路分析 4.2代码 5、题五:判断是否为平衡二叉树5.1思路分析5.1.1平衡二叉树概念5.1.......
  • 邮件地址搜索软件_邮件地址采集软件
    一款搜索邮件地址和手机号码的软件,可以按整站搜索,也可以按关键词搜索关键词搜索支持baiu.com和bing.com。界面简单,使用方法非常简易和方便。易邮件地址搜索大师特色—易邮件地址搜索大师是一款搜索邮件地址和手机号码的软件,可以按整站搜索,也可以按关键词搜索。使用方法非常......
  • Day 13 二叉树part01
    Day13二叉树part01二叉树的递归遍历这个用递归就好,现在写起来基本没问题二叉树的迭代遍历这个是重点,今天写的时候居然一次写出来了,多刷还是有用的。前中后三种遍历方式,其迭代版本的难度排序前<中<后。所以写的时候也是按这个顺序去做的。144.二叉树的前序遍历使用一......
  • 算法金 | 最难的来了:超参数网格搜索、贝叶斯优化、遗传算法、模型特异化、Hyperopt、O
    ​大侠幸会,在下全网同名「算法金」0基础转AI上岸,多个算法赛Top「日更万日,让更多人享受智能乐趣」今日215/10000抱个拳,送个礼为模型找到最好的超参数是机器学习实践中最困难的部分之一1.超参数调优的基本概念机器学习模型中的参数通常分为两类:模型参数和超......
  • 代码随想录算法训练营第十三天 | 144.二叉树的前序遍历、94、二叉树的中序遍历、145、
    144.二叉树的前序遍历题目:.-力扣(LeetCode)思路:有递归法和使用栈来模拟递归的迭代法。代码:1.递归/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nu......
  • 代码随想录day25 复原IP地址 | 子集 | 子集II
    复原IP地址复原IP地址解题思路首先要判断什么是正确的IP地址:段位以0为开头的数字不合法段位里有非正整数字符不合法段位如果大于255了不合法接着就是要通过一个变量来存储加'.'的次数,然后将字符串分成四分,每段都需要检查是否符合条件。知识点回溯(分割),字符串心得这是......
  • Day11(二叉树) | 二叉树的递归遍历 二叉树的迭代遍历 二叉树的统一迭代法 二
    二叉树的递归遍历终于来到了递归!!!递归是进入动态规划的第一步,有部分的递归完全可以写成动态规划!这里可以移步到左程云的视频观看.递归的步骤:确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数,并且还要明确每次递归的返......
  • 矩阵优化 DP 以及全局平衡二叉树实现的动态 DP 学习笔记
    矩阵乘法求斐波那契数列的第\(n\)项,其中\(n\le10^{18}\),对数\(m\)取模。写出转移方程,\(f_i=f_{i-1}+f_{i-2}\),直接算是\(O(n)\)的,似乎没什么办法优化。定义大小分别为\(n\timesp\)和\(p\timesm\)的矩阵(分别为\(a\)和\(b\))相乘的结果(矩阵\(c\))是一个大小为\(......
  • LeetCode - #96 不同的二叉搜索树(Top 100)
    文章目录前言1.描述2.示例3.答案关于我们前言本题为LeetCode前100高频题我们社区陆续会将顾毅(Netflix增长黑客,《iOS面试之道》作者,ACE职业健身教练。)的Swift算法题题解整理为文字版以方便大家学习与阅读。LeetCode算法到目前我们已经更新到94期,......
  • 代码随想录算法训练营第六十六天 | Bellman_ford 队列优化算法(SPFA)、Bellman_ford之
    Bellman_ford队列优化算法(SPFA)题目链接:https://kamacoder.com/problempage.php?pid=1152文档讲解:https://programmercarl.com/kamacoder/0094.%E5%9F%8E%E5%B8%82%E9%97%B4%E8%B4%A7%E7%89%A9%E8%BF%90%E8%BE%93I-SPFA.html思路Bellman_ford算法每次松弛都是对所......