首页 > 其他分享 >代码随想录学习Day 20

代码随想录学习Day 20

时间:2024-03-28 18:01:46浏览次数:28  
标签:20 self 随想录 节点 high low return root Day

669.修剪二叉搜索树

题目链接

讲解链接

思路:采用递归方法,若root.val > high,判断左子树是否为空,若不空,递归遍历左子树,若空就返回null;若root.val < low,则判断右子树是否为空,若不空就递归遍历右子树,若空就返回null;如果low <= root.val <= high,就递归遍历左右子树,最后返回根节点即可。

递归三部曲:

1.递归函数参数及返回值:参数就是当前节点,边界值low,high。返回值为修剪后的二叉搜索树的根节点。

def trimBST(self, root, low, high):

2.递归终止条件:遇到空则返回

if not root:
    return None

3.单层递归逻辑:若当前节点小于low,则遍历其左子树;大于high则遍历其右子树。之后将下一层处理完左右子树的结果返回给当前根节点的左右孩子,最后返回root节点。

if root.val < low:
    return self.trimBST(root.right, low, high)
if root.val > right:
    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

完整代码如下:

class Solution:
    def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:
        if not root:  # 若为空则返回None
            return None
        if root.val < low:  # 小于low则返回其右子树修剪后的结果
            return self.trimBST(root.right, low, high)  # 注意这里不能直接返回root.right,因为以root.right为根节点的树不一定符合区间条件,需要进行递归修剪
        elif root.val > high:  # 大于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

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

题目链接

讲解链接

思路:构造二叉树一般考虑前序遍历的方式。本题由于要构造的是一颗平衡二叉搜索树,所以要选取数组最中间的元素来作为根节点,然后两边的元素递归构造左右子树,这样才能保证左右子树的高度相差不超过1。代码则与之前做过的构造最大二叉树类似,只需将求最大元素改为求最中间元素即可。

class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
        if not nums:  # 数组为空则返回空
            return None
        mid = len(nums) // 2  # 找数组最中间的元素
        root = TreeNode(nums[mid])  # 最中间元素作为根节点->中
        root.left = self.sortedArrayToBST(nums[:mid])  # 递归构造左子树->左
        root.right = self.sortedArrayToBST(nums[mid+1:])  # 递归构造右子树->右
        return root  # 返回根节点

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

题目链接

讲解链接

将本题换一个角度来看,就是对一个有序数组[2, 5, 13]求其从后到前的累加数组,也就是[20, 18, 13]。在二叉搜索树中最右下角的元素是最大的,所以遍历顺序应该是右中左(反中序遍历),从最大的元素开始,每个节点的值为当前值与前一个节点的值的和

递归三部曲:

1.递归函数参数及返回值:参数就是当前遍历的节点,不需要返回值,但需要定义一个全局变量pre来保存当前节点前一个节点的值。

def __init__(self):
    self.pre = 0
def traversal(self, root):

2.递归终止条件:遇到空则直接返回。

if not cur:
    return

3.单层递归逻辑:进行反中序遍历,先遍历右子树,再遍历左子树,将每个节点的值改为其当前值与pre值的和。

self.traversal(cur.right)
cur.val += self.pre
self.pre = cur.val
self.traversal(cur.left)

整体代码如下:

class Solution:
    def __init__(self):
        self.pre = 0  # 定义pre让其保存cur的前一个节点的值,初始为0
    def traversal(self, cur):
        if not cur:  # 遇到空则返回
            return
        self.traversal(cur.right)  # 右
        cur.val += self.pre  # 改变节点值
        self.pre = cur.val  # pre=当前节点的值
        self.traversal(cur.left)  # 左
    def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        self.traversal(root)
        return root

标签:20,self,随想录,节点,high,low,return,root,Day
From: https://blog.csdn.net/weixin_44449447/article/details/137111748

相关文章

  • NVIDIA H200 创下 MLPerf LLM 最新推理记录
    NVIDIAH200TensorCoreGPU和NVIDIATensorRT-LLM创下MLPerfLLM最新推理记录生成式人工智能正在解锁新的计算应用程序,通过持续的模型创新来极大地增强人类的能力。生成式AI模型(包括大型语言模型(LLM))用于制作营销文案、编写计算机代码、渲染详细图像、创作音......
  • 20240328每日一题题解
    20240328每日一题题解摘要本文对于2024年3月28日的每日一题进行了问题重述,并将问题拆解为五个步骤,分别进行了详细的讨论与求解,实现了整型与字符串类型的互相转换。并且还指出,在编写C++程序时,需要观察数据范围,在有必要时使用长整型(longlong)存储数据,以免出现整型溢出现象。关键......
  • 2024最新最全Java和Go面经,面试了30多场,终于上岸了!
    ​>本文来自我们技术交流群群友的投稿,未经授权,禁止转载。原文链接:太难了,Java和Go,面试了30多场,终于上岸了!先听一下TA的故事2023年10月份我就做好了离职跳槽的准备,做了3年Java后端开发的我,对自己的技术能力还是很有底气的。之前虽不是一线大厂,也算是比较知名的中厂了。加上前公......
  • Xilinx ZYNQ 7000+Vivado2015.2系列(十三)私有定时器中断
    私有定时器属于PS部分,定时器可以帮我们计数、计时,有效的控制模块的时序。这一次实验我们认识定时器并使用定时器产生中断。CPU的私有中断(PPI)CPU的私有中断(PPI),5个:全局定时器,私有看门狗定时器,私有定时器以及来自PL的FIQ/IRQ。它们的触发类型都是固定不变的,并且来自P......
  • 代码随想录Day17 ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和
     110.平衡二叉树 classSolution{public://返回以该节点为根节点的二叉树的高度,如果不是平衡二叉树了则返回-1intgetHeight(TreeNode*node){if(node==NULL){return0;}intleftHeight=getHeight(node->left......
  • 2024 VEXIQ 赛季笔(游)记 Pt.1
    2024/03/07老师让我们做机器初步思考了。搞搞戒指,只要一个小夹子加上赛季的抬升吸环改一下就可以了,方便的一批。于是夹子10分钟不到搞完了,现在是缝合怪时间。但是老师下课不让我搞了/kk。2024/03/14学校pi-day为什么不给pi吃?学校pi-day为什么不给pi吃?学校pi-day......
  • 【专题】2024年3月数字化行业报告合集汇总PDF分享(附原数据表)
    原文链接:https://tecdat.cn/?p=35531原文出处:拓端数据部落公众号在科技浪潮的推动下,人工智能行业正在经历着前所未有的变革与发展。从自然语言处理到数字社交,再到AI数字人、绿色智能制造等多个领域,人工智能正逐渐渗透到我们生活的各个角落。然而,这一过程中也伴随着新的挑战和问......
  • Day4 我终于开始学习基础语法啦
    Day4java语法基础一、注释注释是在编写代码过程中的解释说明,一般分为单行注释在代码中用“//”来提出多行注释在代码中用“/*xxx*/”来提出(丫的不打空格typora直接给我加粗)文档注释在代码中用“/**xxx直接加上回车即可附今天的代码内容publicclassHell......
  • 【专题】2022年中国制造业数字化转型研究报告PDF合集分享(附原数据表)
    报告链接:http://tecdat.cn/?p=32145本文中所说的制造业数字化转型,指的是在制造企业的设计、生产、管理、销售及服务的每一个环节中,将新一代信息技术应用到制造企业的设计、生产、管理、销售及服务的每一个环节中,并可以以每一个环节中产生的数据为基础,展开控制、监测、检测、预测......
  • dubhe2024 BuggyAllocator:通过修改_IO_2_1_stdout_的内容进行任意读
    在堆题中遇到没有show()函数的情况,导致无法泄露地址。这时可以通过修改_IO_2_1_stdout_来强制程序输出一段内存,从而泄露需要的地址。例题:dubhe2024BuggyAllocatordubhe2024,xctf分站赛最后一场凄惨爆零,主看了这道题一整天,逆清楚了但找不到漏洞。事后来看当时就算找到洞了也不会......