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

代码随想训练营第二十三天(Python)| 669. 修剪二叉搜索树 、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

时间:2023-11-02 20:25:01浏览次数:43  
标签:right 转换 cur self 二叉 搜索 return root left

669. 修剪二叉搜索树
树的修剪方式赋值。
1、递归法

class Solution:
    def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:
        if root is None:
            return None
        if root.val < low:
            return self.trimBST(root.right, low, high) # 修剪右子树并返回
        if root.val > high:
            return self.trimBST(root.left, low, high)
        root.left = self.trimBST(root.left, low, high) # 赋值剪枝
        root.right = self.trimBST(root.right, low, high)
        return root

2、迭代法

class Solution:
    def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:
        if root is None:
            return None
        # 先找到 root 的位置在 [low, high] 区间
        while root and (root.val < low or root.val > high):
            if root.val < low:
                root = root.right
            else:
                root = root.left

        cur = root
        # 处理小于 low 的部分
        while cur:
            while cur.left and cur.left.val < low:
                cur.left = cur.left.right # 赋值剪枝
            cur = cur.left

        cur = root
        while cur:
            while cur.right and cur.right.val > high:
                cur.right = cur.right.left # 赋值剪枝
            cur = cur.right

        return root

108.将有序数组转换为二叉搜索树
1、递归法

class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
        return self.traversal(nums, 0, len(nums) - 1)

    def traversal(self, nums, left, right):
        if left > right:
            return None
        mid = left + (right - left) // 2
        root = TreeNode(nums[mid])
        root.left = self.traversal(nums, left, mid-1)
        root.right = self.traversal(nums, mid+1, right)
        return root

538.把二叉搜索树转换为累加树
1、迭代法

    def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        if root is None:
            return
        cur = root
        stack = []
        pre = 0 # 记录上一个节点的值
        while cur or stack:
            # 右
            if cur:
                stack.append(cur)
                cur = cur.right
            else:
                # 中
                cur = stack.pop()
                if pre:
                    cur.val += pre.val
                pre = cur
                # 左
                cur = cur.left
        return root

2、递归

class Solution:
    def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        self.pre = 0 # 记录前一个节点
        self.traversal(root)
        return root

    def traversal(self, root):
        if root is None:
            return 
        self.traversal(root.right) # 右
        # 中
        if self.pre:
            root.val += self.pre
        self.pre = root.val
        self.traversal(root.left) # 左

标签:right,转换,cur,self,二叉,搜索,return,root,left
From: https://www.cnblogs.com/yixff/p/17803942.html

相关文章

  • 迭代加深,双向搜索,IDA*,A*,双端队列BFS
    迭代加深://迭代加深搜索//给搜索设定一个范围,如果在这个范围内没有答案那么再加大搜索范围//这么做是为了防止搜索过深,导致利用大量时间搜索无用信息//如果当前搜索是第10位,搜索的是个二叉树,那么前9个就是2^0+2^1+2^2+..+2^9=2^10-1,所以时间复杂度并没增大太多//htt......
  • 98. 验证二叉搜索树(中)
    目录题目法一、前序遍历法二、中序遍历ifnot语法法三、后序遍历题目给你一个二叉树的根节点root,判断其是否是一个有效的二叉搜索树。有效二叉搜索树定义如下:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须......
  • 在线直播系统源码,vue实现搜索文字高亮功能
    在线直播系统源码,vue实现搜索文字高亮功能1、在页面中使用v-html渲染 <template> <divclass="box">  <!--搜索框-->  <divclass="mySearch">   <van-search    v-model="PopUpSarCh"    show-action    placeholder=&......
  • 力扣2610. 转换二维数组(哈希表)
    给你一个整数数组 nums 。请你创建一个满足以下条件的二维数组:二维数组应该 只 包含数组 nums 中的元素。二维数组中的每一行都包含 不同 的整数。二维数组的行数应尽可能 少 。返回结果数组。如果存在多种答案,则返回其中任何一种。请注意,二维数组的每一行上可以......
  • JavaScript中大于Math.pow(2, 53)的数,如何进行进制转换?精度问题,超过18位的数字如何进
    console.log('JavaScript中大于Math.pow(2,53)的数,如何进行进制转换?')//示例console.group('示例')console.log('使用bignumber.js库完美解决。[https://github.com/MikeMcl/bignumber.js/]')console.log('示例:18446744071545290752转为二进制')console.log......
  • 使用亚马逊云科技大语言模型及搜索服务打造知识库:场景及组件介绍
     背景 知识库需求在各行各业中普遍存在,例如制造业中历史故障知识库、游戏社区平台的内容知识库、电商的商品推荐知识库和医疗健康领域的挂号推荐知识库系统等。为保证推荐系统的实效性和准确性,需要大量的数据/算法/软件工程师的人力投入和包括硬件在内的物力投入。其次,为了进一步......
  • 字符与数字的相互转换C++
    一、字符转数字char类型字符转换为数字,其实是转换为ASCII码值有两种方式:1.强制类型转换,结果为对应的ASCII码值charv1='a';charv2='z';charv3='1';charv4='9';intnum1=(int)v1;intnum2=(int)v2;intnum3=(int)v3;intnum4=(int)v4;printf......
  • Python JSON 使用指南:解析和转换数据
    JSON是一种用于存储和交换数据的语法。JSON是文本,使用JavaScript对象表示法编写。Python中的JSONPython有一个内置的json包,可用于处理JSON数据。示例:导入json模块:importjson解析JSON-从JSON转换为Python如果您有一个JSON字符串,可以使用json.loads()......
  • Python JSON 使用指南:解析和转换数据
    JSON是一种用于存储和交换数据的语法。JSON是文本,使用JavaScript对象表示法编写。Python中的JSONPython有一个内置的json包,可用于处理JSON数据。示例:导入json模块:importjson解析JSON-从JSON转换为Python如果您有一个JSON字符串,可以使用json.loads()......
  • 禅道18.0_beta如何在项目需求列表页面通过自定义字段搜索
    里面的字段实际上是从product模块取的,只需要扩展product的config就可以了在extension/custom新建product/ext/config/test.php名字随意<?php$config->product->search['fields']['extrarNumber']=$lang->story->extraNumber;$config->product->......