算法训练记录day23

669. 修剪二叉搜索树

思路icon-default.png?t=N2N8https://programmercarl.com/0669.%E4%BF%AE%E5%89%AA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html 题目icon-default.png?t=N2N8https://leetcode.cn/problems/trim-a-binary-search-tree/

# 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:      # 节点小于最小值,节点需要向右移动
            return self.trimBST(root.right,low,high)
        if root.val > high:     # 节点大于最大值,节点需要向左移动
            return self.trimBST(root.left,low,high)
# 这里需要多次判定,在这个节点区间,不是所用节点都符合条件。
# 以下左孩子,右孩子 只返回有效节点。所以需要递归
        if low <= root.val <= high:     # 如果节点落在区间范围了,以下起到的是删除区间内不符合的节点
            root.left = self.trimBST(root.left,low,high) # 让,满足条件的左叶子挂在该节点的左孩子上
            root.right = self.trimBST(root.right,low,high)
        return root
        # if not root or root.val < low or root.val > high:         # 终止条件
        #     return None
      
        # root.right = self.trimBST(root.right,low,high)
      
        # root.left =  self.trimBST(root.left,low,high)
       
# 这段代码只能找到部分,节点之间还有不符合条件的点,而误删除有用的节点
        # return root

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

思路icon-default.png?t=N2N8https://programmercarl.com/0108.%E5%B0%86%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E8%BD%AC%E6%8D%A2%E4%B8%BA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html题目icon-default.png?t=N2N8https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/

# 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 sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
        root = self.traversal(nums,0,len(nums)-1)
        return root
    def traversal(self, nums: List[int], left: int, right: int) -> TreeNode:
        if left > right:
            return None
        mid = left + (right - left) // 2
        mid_root = TreeNode(nums[mid])
        mid_root.left = self.traversal(nums,left,mid-1)
        mid_root.right = self.traversal(nums,mid+1,right)   
        return mid_root

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

思路icon-default.png?t=N2N8https://programmercarl.com/0538.%E6%8A%8A%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E8%BD%AC%E6%8D%A2%E4%B8%BA%E7%B4%AF%E5%8A%A0%E6%A0%91.html题目icon-default.png?t=N2N8https://leetcode.cn/problems/convert-bst-to-greater-tree/

# 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 __init__(self):
        self.cur = 0   # 初始化

    def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        if not root:
            return None

        self.convertBST(root.right) # 右
        self.cur += root.val    # 累加节点
        root.val = self.cur     # 把累加值赋给当前节点
        self.convertBST(root.left)  # 左

        return root

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值