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

文章目录


前言

迭代法都没看主要是669和538【538很简单】

669. 修剪二叉搜索树


思路

不用看教程,思路很清晰

💖总体思路【单层递归逻辑】

  1. 如果当前节点的值小于low,就处理root的右子树(因为左子树一定不符合),返回右子树的修剪结果,也就是return traversal(root.right)
  2. 如果root的val大于high的话,就处理root的左子树(因为右子树一定不符合了),返回左子树修剪之后的结果,也就是return traversal(root.left)
  3. 如果root的val处于区间之间,需要修剪他的左右子树,也就是root.left = traversal(root.left),右边子树同理。
    终止条件:如果为null,返回null

方法一 递归法

python 复制代码
class Solution(object):
    def trimBST(self, root, low, high):
        """
        :type root: TreeNode
        :type low: int
        :type high: int
        :rtype: TreeNode
        """
        if root == 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)
        if root.val<= high and root.val>=low:
            root.left = self.trimBST(root.left,low,high)
            root.right = self.trimBST(root.right,low,high)
            return root

方法二 迭代法

python 复制代码

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

本题掌握递归法就够了,递归法比较复杂,升级版本;

思路

递归三部曲

  1. 传入返回值:传入的是指向数组的指针,和范围;函数返回的是由这个范围内的数组构成的二叉树的根节点
  2. 终止条件:如果传入的数组范围中left>right,那就返回none
  3. 单层递归逻辑:找到中间节点,作为root,root-left为左边区间构建的二叉树,右边同理

注意点

  1. . 为了保证构造的是平衡二叉树,所以根节点是中间的值
  2. . 注意传入的数组范围区间:本题中定义的是左闭右闭

方法一 递归法

写代码注意点:

  1. 因为是左闭右闭的,所以判断迭代终止条件为left大于right
  2. 传入的只是数组,而不是节点,这个要注意
python 复制代码
class Solution(object):
    def traversal(self,left,right):
        if left > right: 
            return None 
        mid = (left + right)//2
        node = TreeNode(val = self.nums[mid])
        node.left = self.traversal(left,mid-1)
        node.right = self.traversal(mid+1,right)
        return node
    def sortedArrayToBST(self, nums):
        """
        :type nums: List[int]
        :rtype: TreeNode
        """
        self.nums = nums
        root = self.traversal(0,len(nums)-1)
        return root
 # 精简版 传递切片
 class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
        if not nums:
            return
        mid = len(nums) // 2
        root = TreeNode(nums[mid])
        root.left = self.sortedArrayToBST(nums[:mid])
        root.right = self.sortedArrayToBST(nums[mid + 1 :])
        return root       

方法二 迭代法

本题迭代法比较困难,就不用放了。

python 复制代码

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

题目的意思是:将二叉树中某节点的新的值为原先树中大于这个节点的数的值的累加。

思路

总体思路:很简单,右中左遍历就行。定义一个全局变量累加

方法一

python 复制代码
class Solution(object):
    def __init__(self):
        self.count = 0
        
    def traversal(self,root):
        if root == None: return None
        if root.right: self.traversal(root.right)
        self.count += root.val
        root.val = self.count
        if root.left: self.traversal(root.left)
        return root
    def convertBST(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        re = self.traversal(root)
        return re
        

方法二

python 复制代码

总结

相关推荐
积极向上的向日葵36 分钟前
链表的中间节点
数据结构·算法·链表·快慢指针
曾几何时`1 小时前
C++——哈希表
算法·哈希算法
Y1nhl1 小时前
力扣hot100_普通数组_python版本
开发语言·python·算法·leetcode·职场和发展
m0_504135303 小时前
代码随想录算法训练营第六十一天 | floyd算法
算法
xin007hoyo7 小时前
算法笔记.染色法判断二分图
数据结构·笔记·算法
এ᭄画画的北北9 小时前
力扣-234.回文链表
算法·leetcode·链表
八股文领域大手子10 小时前
深入理解缓存淘汰策略:LRU 与 LFU 算法详解及 Java 实现
java·数据库·算法·缓存·mybatis·哈希算法
__lost10 小时前
C++ 解决一个简单的图论问题 —— 最小生成树(以 Prim 算法为例)
算法·图论·最小生成树·prim算法
wuqingshun31415912 小时前
蓝桥杯 11. 打印大X
数据结构·算法·职场和发展·蓝桥杯·深度优先
Blossom.11812 小时前
量子网络:构建未来通信的超高速“高速公路”
网络·opencv·算法·安全·机器学习·密码学·量子计算