算法练习Day19 (Leetcode/Python-二叉树)

108. Convert Sorted Array to Binary Search Tree

Given an integer array nums where the elements are sorted in ascending order, convert it to a 

height-balanced

 binary search tree.

思路:

一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。因为是有序数组,所以取Node的位置并不难,类似于二分法。用递归感觉比迭代更简单一点?

递归法:


class Solution(object):
    def traversal(self, nums, left, right):
        if left <= right:
            mid = (left + right)//2
        else:
            return None 
        
        root = TreeNode(nums[mid]) # 这里采用中序遍历。想清楚递归的input和output。一开始root为Tree的根节点,逐层递归到叶节点,这时候return为None,那么叶节点是这里的root,root.left = None。再回到上一层,root为刚才叶节点的parent,root.left就是叶节点了。最后递归完毕回到root。 
        root.left = self.traversal(nums, left, mid-1)
        root.right = self.traversal(nums, mid+1, right)
        return root
    

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

        

迭代法:

from collections import deque

class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
        if len(nums) == 0:
            return None
        
        root = TreeNode(0)  # 初始根节点
        nodeQue = deque()   # 放遍历的节点
        leftQue = deque()   # 保存左区间下标
        rightQue = deque()  # 保存右区间下标
        
        nodeQue.append(root)               # 根节点入队列
        leftQue.append(0)                  # 0为左区间下标初始位置
        rightQue.append(len(nums) - 1)     # len(nums) - 1为右区间下标初始位置

        while nodeQue:
            curNode = nodeQue.popleft()
            left = leftQue.popleft()
            right = rightQue.popleft()
            mid = left + (right - left) // 2

            curNode.val = nums[mid]  # 将mid对应的元素给中间节点

            if left <= mid - 1:  # 处理左区间
                curNode.left = TreeNode(0)
                nodeQue.append(curNode.left)
                leftQue.append(left)
                rightQue.append(mid - 1)

            if right >= mid + 1:  # 处理右区间
                curNode.right = TreeNode(0)
                nodeQue.append(curNode.right)
                leftQue.append(mid + 1)
                rightQue.append(right)

        return root

538. Convert BST to Greater Tree

Given the root of a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original BST is changed to the original key plus the sum of all keys greater than the original key in BST.

As a reminder, a binary search tree is a tree that satisfies these constraints:

  • The left subtree of a node contains only nodes with keys less than the node's key.
  • The right subtree of a node contains only nodes with keys greater than the node's key.
  • Both the left and right subtrees must also be binary search trees.

思路:二叉搜索树上每个节点按序累加之前的节点值之和,成为更大的节点值。

注意二叉树是有序的,根据例子,是进行了右中左的顺序累加的。所以也就是以右中左的顺序遍历二叉树就好。感觉把二叉树的搜索顺序搞清楚后,解题代码就比较模版化了。回头可以再好好复习一下二叉树的搜索。

递归法:

class Solution(object):
    def __init__(self):
        self.last = 0

    def traversal(self, root):
        if root is None:
            return 
        self.traversal(root.right) # left 
        root.val = root.val + self.last # middle
        self.last = root.val
        self.traversal(root.left) # right 
    
    def convertBST(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        self.last = 0 
        self.traversal(root)
        return root 

化简一些的递归法:

class Solution:
    def __init__(self):
        self.count = 0

    def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        if root == None:
            return 
        '''
        倒序累加替换:  
        '''
        # 右
        self.convertBST(root.right)

        # 中
        # 中节点:用当前root的值加上pre的值
        self.count += root.val
        root.val = self.count 
        # 左
        self.convertBST(root.left)

        return root 

迭代法:

class Solution:
    def __init__(self):
        self.pre = 0  # 记录前一个节点的数值
    
    def traversal(self, root):
        stack = []
        cur = root
        while cur or stack:
            if cur:
                stack.append(cur)
                cur = cur.right  # 右
            else:
                cur = stack.pop()  # 中
                cur.val += self.pre
                self.pre = cur.val
                cur = cur.left  # 左
    
    def convertBST(self, root):
        self.pre = 0
        self.traversal(root)
        return root

一点碎碎念:写博客的初衷就是记录自己的练习的过程。我还处在刷题的初期->中期的阶段吧。我目前刷题的习惯是每次看一下题,有思路就直接写,没有思路就先去看一些解析。看了解析如果觉得比较清楚了就自己写出来,不然继续看答案,看了答案后盖住答案再自己写。如果看了答案还不太明白或者太绕,一次性自己肯定写不下来的话,我就会一边把答案抄一边写注释分析。这样是为了防止自己花太多时间困在一道题上(最近还真挺忙的,抽出时间来刷题),也防止畏难了就分心了。所以这个博客里的大部分答案是源于其他博客的,主要是卡哥的代码随想录(link见reference),我只是答案的搬运工,不过我附上了主要是自己写的思路。

写这个博客的目的是记录思路方便自己回看复习,也是站在一个刷题入门者的角度阐述一下自己的思路吧,如果能鼓励到其他刷题的同路人或者带来一点点的启发也算是额外之喜了。

Reference:

代码随想录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/264955.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开启虚拟与现实的融合时代

数字人直播&#xff0c;作为一项新兴技术&#xff0c;正逐渐改变着我们的生活方式和沟通方式。它通过利用最先进的人工智能技术&#xff0c;使得虚拟形象得以与现实世界实时互动&#xff0c;为用户带来了全新的体验。本文将探讨数字人直播的意义、应用场景以及可能带来的影响。…

利用MultCloud在线复制传输不同网盘之间的数据:支持谷歌Drive、百度网盘等

本文介绍通过MultCloud平台&#xff0c;在国内实现谷歌Drive、OneDrive、百度网盘等不同云盘之间数据的传输、共享等操作的免费方法。 有的时候&#xff0c;我们希望对自己不同网盘之间的数据加以传输、共享&#xff1b;例如&#xff0c;我们可以将自己谷歌Drive中的数据&#…

Deep learning-based small object detection: A survey(2023)

文章目录 AbstractIntroductionContribution Generic SOD algorithms提高输入特征的分辨率&#xff08;Most Important&#xff09;Methods 尺度感知训练Methods 融合上下文信息Methods 数据增强Methods 其他策略Methods 关键的SOD任务小人脸检测Methods 小型行人检测Methods 航…

在线考试系统-软件与环境

一. 软件 1.Navicat、phpstudy、Idea、Vsode 参考 网盘链接 二.配置文件 1.NodeJS、JDK、Mysql 参考 网盘链接 注意点&#xff1a; 1.Mysql 切记需要环境变量配置 2.数据库密码要好记点的&#xff0c;别乱设 3.环境变量配置的路径要能找到 三.安装运行 1.下载网盘内的软件&am…

【ps】常见工具说明

1&#xff1a;污点修复工具 》内容识别 去除脸部珍珠 》创建纹理 2&#xff1a;修复画笔工具 按住ALT选择一处你想移动的地方 3&#xff1a;修补工具 》内容识别 选择一个区域 将区域内的东西移动到 另一处皮肤上

【Linux笔记】系统信息

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux学习 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 命令 1. uname - 显示系统信息 2. hostname - 显示或设置系统主机名 3. top - 显示系统资源使用情况 4. df - 显示磁盘空间使用情…

Socket.D 基于消息的响应式应用层网络协议

首先根据 Socket.D 官网 的副标题&#xff0c;Socket.D 的自我定义是&#xff1a; 基于事件和语义消息流的网络应用协议。官网定义的特点是&#xff1a; 基于事件&#xff0c;每个消息都可事件路由所谓语义&#xff0c;通过元信息进行语义描述流关联性&#xff0c;有相关的消…

【前端】前后端通信方法与差异(未完待续)

系列文章 【Vue】vue增加导航标签 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/134965353 【Vue】Element开发笔记 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/133947977 【Vue】vue&#xff0c;在Windows IIS平台…

Ubuntu 常用命令之 netstat 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 netstat 是一个非常有用的命令行工具&#xff0c;它可以帮助我们监控和诊断网络问题。在 Ubuntu 系统中&#xff0c;我们可以使用 netstat 命令来查看网络连接、路由表、接口统计等信息。 netstat 命令的参数有很多&#xff0c;以…

如何用CHAT做调研?

问CHAT&#xff1a;高校之间关于艺术教育专业调研情况 CHAT回复&#xff1a;对于高校之间的艺术教育专业调研&#xff0c;以下几个方面可能会涉及&#xff1a; 1. 课程设计和学分&#xff1a;可以调研不同高校艺术教育专业的课程设置&#xff0c;包括专业核心课程、相关选修课…

论文润色的注意事项有哪些 papergpt

大家好&#xff0c;今天来聊聊论文润色的注意事项有哪些&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff0c;可以借助此类工具&#xff1a; 标题&#xff1a;论文润色的注意事项――确保论文质量与表达的关键…

Leetcode 406 根据身高重建队列

题意理解&#xff1a; people [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]] 给定一个二维数组&#xff0c;&#xff08;h,k&#xff09;h表示此人身高&#xff0c;k表示前面有几个人比他高。 我们按照每个人的h,k两个维度的需求给每个人排在合适的位置。 如&#xff1a; [5,0][7,0]…

如何提升亚马逊、速卖通店铺自然排名?测评自养号的关键要素

一、自然排名的重要性 一条链接是否推广成功或者赚到钱&#xff0c;就看这条链接的自然排名有没有打上来! 无论是搜索流量的自然排名&#xff0c;还是关联流量的自然排名&#xff0c;或BSR排行榜&#xff0c;这些自然排名的入口就是我们要时刻盯紧的位置。 二、自然排名的位…

C语言之字符串

目录 字符串字面量 ​编辑 字符串字面量的长度 ◆具有静态生命周期 ◆对于同一个字符串字面量的处理方式依赖于编译器 字符串 字符数组的初始化赋值 空字符串 字符串的读取 在前面的学习中就会发现&#xff0c;仅仅能用一个字符表示的事物少之又少&#xff0c;对于地…

【LeetCode 热题 HOT 100】题解笔记 —— Day03

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

职场利器-软考高级、PMP、CKA/CKS/CKAD备考

1、【软考高级】信息系统项目管理师 全国计算机技术与软件专业技术资格(水平)考试网上报名平台http://bm.ruankao.org.cn/sign/welcome 模拟作答系统230747 第一次裸考 考试成绩查询 三科均未通过 软考考试多少分通过? ​​​​​​​ 软考高级&#xff0c;它的考试科目是《…

黄鼠狼目标检测数据集VOC+YOLO格式400张

黄鼠狼是一种小型哺乳动物&#xff0c;通常分布在亚洲和欧洲的森林和草原地区。它们的身体长度约为30-50厘米&#xff0c;体重约为0.5-1.5千克。黄鼠狼的身体呈灰黄色&#xff0c;背部有黑色条纹&#xff0c;尾巴短而毛茸茸的。 黄鼠狼是一种夜行性动物&#xff0c;主要以小型…

网络通信--深入理解网络和TCP / IP协议

计算机网络体系结构 TCP/IP协议族 TCP / IP 网络传输中的数据术语 网络通信中的地址和端口 window端查看IP地址和MAC地址&#xff1a;ipconfig -all MAC层地址是在数据链路层的&#xff1b;IP工作在网络层的 MAC是48个字节&#xff0c;IP是32个字节 在子网&#xff08;局域…

TIA博途Wincc_通过VBS脚本实现电机风扇或水泵旋转动画的具体方法

TIA博途Wincc_通过VBS脚本实现电机风扇或水泵旋转动画的具体方法 前面和大家介绍了通过在PLC中编程,结合HMI的图形IO域实现电机风扇或水泵旋转动画的具体方法,详细内容可参考以下链接: TIA博途Wincc中制作电机风扇或水泵旋转动画的具体方法示例 本次和大家分享通过VBS脚本实…

智能图像编辑软件Luminar Neo mac提供多种调整和滤镜选项

Luminar Neo mac是一款由Skylum公司开发的AI技术图像编辑软件&#xff0c;旨在为摄影师和视觉艺术家提供创意图像编辑解决方案。Luminar Neo拥有强大的AI技术和丰富的后期处理工具&#xff0c;可帮助用户快速轻松地实现从基本到高级的图像编辑需求。 Luminar Neo提供了多种调整…