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

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

时间:2024-10-19 21:32:12浏览次数:7  
标签:right val self 随想录 二叉 搜索 traversal root left

学习资料:https://programmercarl.com/0669.修剪二叉搜索树.html#算法公开课

学习记录:
669.修剪二叉搜索树(直接在原函数上操作,要根据情况用root的左右子树递归,因为子树中有满足条件的;前序:根左右)

点击查看代码
# 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 not root:
            return None
        if root.val < low:
            right = self.trimBST(root.right, low, high)
            return right

        if 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


        

108.将有序数组转换为二叉搜索树(前序构造,加traversal函数:取数组中值作为根节点,中左右的构造二叉树)

点击查看代码
# 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 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

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

538.把二叉搜索树转换为累加树(处理一个节点的方法是把树中比该节点值大的都加给这个节点;双指针;加一个traversal函数,不用返回值;从大到小,用右中左遍历顺序)

点击查看代码
# 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 convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        self.pre = 0   # 初始pre指向最大值指向的NULL,则为0
        self.traversal(root)
        return root

    def traversal(self, cur):
        # 不用返回什么,只是在处理self
        if not cur:
            return
        # 按顺序要反着来遍历,从最大的开始,那大的加给小的值
        # 所以用右中左
        self.traversal(cur.right)
        # 双指针,pre的下一位是cur
        cur.val += self.pre
        self.pre = cur.val
        self.traversal(cur.left)
        

PS:二叉树终于学完了,也太多了,训练营已经过去三分之一,坚持就是胜利!二叉树学的比较完善
原来周六也要学习啊,不愧是996的行业技能。今天水过去了,✌
今天吃了大餐,越做题越撑,太爽了。清蒸鲈鱼、回锅肉、包子、面条、清炒油麦菜、核桃、柚子、葡萄

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

相关文章

  • 代码随想录算法训练营 | 647. 回文子串,516.最长回文子序列
    647.回文子串题目链接:647.回文子串文档讲解︰代码随想录(programmercarl.com)视频讲解︰回文子串日期:2024-10-19想法:本题精髓在于dp[i][j]表示的是s[i,j]这个子字符串是不是回文的,是Boolean类型,s[i]s[j]不等时,肯定不回文;s[i]s[j]相等时,开始看ij的大小,ij大小相等那么表示单个字......
  • 3.1.1 内核对用户空间的管理2,搜索目标地址所在的节点
    3.1.1内核对用户空间的管理2,搜索目标地址所在的节点3.1.1内核对用户空间的管理2,搜索目标地址所在的节点文章目录3.1.1内核对用户空间的管理2,搜索目标地址所在的节点MmLocateMemoryAreaByAddress()函数的实现MmLocateMemoryAreaByAddress()函数的实现内核函数MmLoc......
  • Leecode热题100-101.对称二叉树
    给你一个二叉树的根节点 root ,检查它是否轴对称。示例1:输入:root=[1,2,2,3,4,4,3]输出:true示例2:输入:root=[1,2,2,null,3,null,3]输出:false提示:树中节点数目在范围 [1,1000] 内-100<=Node.val<=100进阶:你可以运用递归和迭代两种方法解决这个问......
  • GoFly快速开发框架集成ZincSearch全文搜索引擎-ZincSearch是ElasticSearch轻量级替代
    前言我们在项目开发中会遇到如下业务场景:1. 电子商务:实现商品搜索与推荐、价格监控。2. 日志分析:进行系统日志分析和网络流量监控。3. 社交媒体:内容搜索与发现以及用户行为分析。4. 企业知识管理:进行知识搜索与共享和文档版本管理。5. 新闻媒体:实现新闻搜索与推荐以......
  • 代码随想录算法训练营第四天| 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点
    1.leetcode24两两交换链表中的节点题目链接:24.两两交换链表中的节点-力扣(LeetCode)文章链接:代码随想录(programmercarl.com)视频链接:帮你把链表细节学清楚!|LeetCode:24.两两交换链表中的节点_哔哩哔哩_bilibili1.1代码这个代码是用循环的思路来进行判断的,写的过程挺......
  • 二叉搜索树
    publicclassBinarSearchTree{privateNode_tree;publicBinarSearchTree(List<int>datas){if(datas!=null){foreach(varitemindatas){Insert(item);}......
  • Notepad++将搜索内容所在行选中,并进行复制等操作
    背景Notepad++在非常多的数据行内容中,按照指定内容检索,并定位到具体行,而后对内容行的数据进行复制、剪切、删除等处理动作。操作说明检索并标记所在行弹出搜索框:按下Ctrl+F。输入查找字符串:在搜索框中输入要查找的字符串。标记记录:在查找框顶部菜单中选择【标......
  • 111. 二叉树的最小深度
    思路递归时考虑几种情况:1.左右子树都为空,则最小深度=1(只有根节点)(也可理解为min(0,0)+1)2.左子树为空,右子树不空,则最小深度=右子树最小深度+13.左子树不为空,右子树为空,最小深度=左子树最小深度+14.左右子树不为空,最小深度=左右子树最小深度+1+1原因:递归的是左右子树,......
  • 代码随想录打卡Day2
                                                                                                                                   ......
  • 代码随想录打卡Day3
    链表:通过指针链接的线性数据结构。链表由两部分组成,一为数据域,一为指针域。并与结构体有很大关系,链表的节点一般都是结构体,其中包含了该节点的数据部分以及指向下一节点的指针。通过这种方式,链表将结构体与指针连接起来,从而构建一个强大的数据结构,可以同时实现数据的组织和动......