669. 修剪二叉搜索树 , 108.将有序数组转换为二叉搜索树 , 538.把二叉搜索树转换为累加树

思路

给定范围要求去除二叉树中不满足范围的节点

思考对于每个节点的处理

对于当前节点,低于下界,右子树节点

如果高于上街,使用左子树节点

如果时空节点,那么返回空姐点

在考虑root节点,将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:
            return self.trimBST(root.right,low,high)
        elif root.val>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

思路

根据有序数组来返回二叉搜索树,有序数组和二叉搜索树的性质有密切联系

我们使用向下取整来作为根节点

终止条件:当nums为空时返回空节点

对于根节点

把mid作为根节点

然后去处理左子树和右子树

对于左子树和右子树,分别使用nums切片左边和右边来寻找左右节点

输出一样是根节点

代码

# 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]:
        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 

思路

使用一个sum变量来储存节点值和

终止条件:节点为空

先遍历右节点

对于根节点进行如下处理:

使用sum加上当前节点值

更改节点值

处理左节点

代码

# 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.sum=0
        def dfs(node):
            if not node:
                return  
            dfs(node.right)
            self.sum+=node.val 
            node.val=self.sum
            dfs(node.left)
        dfs(root)
        return root

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值