LeetCode 第二十二天 2024.8.8

1. :.删除二叉搜索树中的节点
 题目链接: 450. 删除二叉搜索树中的节点 - 力扣(LeetCode)
应用条件:递归,有返回值

难点:

二叉树中的删除操作会比添加操作难很多,因为删除对应着结构也要跟着改变。所以删除要考虑的情况多一些,尤其是当遍历到当前的结点的值和要寻找的key值相同且当前节点左右孩子都不是none的时候,我们要先找到当前节点右子树的最左边的节点,再把当前节点的左子树放到右子树的最左边的节点的左节点。说实话看起来很绕,但最关键的就是要找的当前节点右子树的最左边的节点。

个人错误:

在对root.left 和root.right递归的时候没有输出返回值。

思路:

# 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 deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:
        if root == None:
            return root
        if root.val == key:
            if root.left == None and root.right == None:
                return None
            elif root.left == None and root.right != None:
                return root.right
            elif root.left != None and root.right == None:
                return root.left
            else:
                cur = root.right
                while cur.left is not None:
                    cur = cur.left
                cur.left = root.left
                return root.right
        if root.val > key:
            root.left = self.deleteNode(root.left,key)
        if root.val < key:
            root.right =self.deleteNode(root.right,key)

        return root

        
            
        

2. :修剪二叉搜索树
 题目链接: 669. 修剪二叉搜索树 - 力扣(LeetCode)
应用条件:递归,有返回值

难点:

遇到二叉搜索数和一个特定值进行比较的问题时,一定要想起二叉搜索数是有顺序的。

个人错误:

没有想到有返回值然后直接root.left = 递归root.left后的返回值,root.right 也同理。

思路:

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

3. :将有序数组转换为二叉搜索树
 题目链接: 108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)
应用条件:递归,有返回值

难点:

每次去最中间的元素然后一直遍历,有返回值当作前一个遍历节点的left和right

直接用mid=(left+right)//2可能会超出范围,用mid=left+(right - left)//2就不会了。

个人错误:

思路:

# 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.trav(nums, 0, len(nums) - 1)
        return root

    def trav(self,nums,left,right):
        if left > right:
            return None
        mid = left+(right-left)//2
        root = TreeNode(nums[mid])
        root.left = self.trav(nums, left, mid - 1)
        root.right = self.trav(nums, mid + 1, right)
        return root

4. :把二叉搜索树转换为累加树
 题目链接: 538. 把二叉搜索树转换为累加树 - 力扣(LeetCode)
应用条件:递归,不返回值

难点:

从题目中看懂树是从右下角开始遍历的,像原先的题一样有一个pre节点,一个一个右中左遍历即可。当前节点的值变成当前节点 的值加上pre的值。

个人错误:

思路:

# 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.pre = None
        self.summ = 0
    def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        self.trav(root)
        return root
        
    def trav(self,root):
        if root == None:
            return root
        self.convertBST(root.right)
        if self.pre != None:
            root.val = root.val + self.pre.val
        self.pre = root
        self.convertBST(root.left)
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值