• 2022/4/112022/4/16


    题目:538. Convert BST to Greater Tree

     

    思路:

    基本思想就是根据二叉搜索树的特性,一个节点比他大的点都一定在他的右边,可以先遍历书,取出所有的值,然后按照右--左的顺序遍历整个书,保证按照从大到小的顺序访问所有的节点,则每个节点应该加的值就是前面所访问过的节点的和。

    代码:

    def convertBST(self, root):
    
        def visit1(root):
    
            if root:
    
                visit1(root.left)
    
                vals.append(root.val)
    
                visit1(root.right)
    
        vals = []
    
        visit1(root)
    
        
    
        self.s = 0
    
        def visit2(root):
    
            if root:
    
                visit2(root.right)
    
                self.s += vals.pop()
    
                root.val = self.s
    
                visit2(root.left)
    
        visit2(root)
    
     
    
        return root

    题目:34. Find First and Last Position of Element in Sorted Array

     

    思路:

    看到logn,基本上就是开始想二分,所以问题转化为二门求左边界和右边界,实际上就是再二分到目标值时边界缩小左边界还是右边界

    代码:

        def searchRange(self, nums, target):
    
            def binarySearchLeft(A, x):
    
                left, right = 0, len(A) - 1
    
                while left <= right:
    
                    mid = (left + right) // 2
    
                    if x > A[mid]: left = mid + 1
    
                    else: right = mid - 1
    
                return left
    
     
    
            def binarySearchRight(A, x):
    
                left, right = 0, len(A) - 1
    
                while left <= right:
    
                    mid = (left + right) // 2
    
                    if x >= A[mid]: left = mid + 1
    
                    else: right = mid - 1
    
                return right
    
            
    
            left, right = binarySearchLeft(nums, target), binarySearchRight(nums, target)
    
            return (left, right) if left <= right else [-1, -1]

    题目:669. Trim a Binary Search Tree

     

    思路:

    本题需要利用到二叉搜索树的特性,即节点左子树的点都小于这个点,右子树的点都大于这个节点。所以当节点小于范围左边界时,左子树都应该被舍弃,当节点大于范围右边界时,右子树都应该被舍弃。基于上述道理,利用递归原理即可完成下面的代码

    代码:

          def trimBST(self, root, L, R):
    
            def trim(node):
    
                if node:
    
                    if node.val > R:
    
                        return trim(node.left)
    
                    elif node.val < L:
    
                        return trim(node.right)
    
                    else:
    
                        node.left = trim(node.left)
    
                        node.right = trim(node.right)
    
                        return node
    
     
    
            return trim(root)

    题目:24. Swap Nodes in Pairs

     

    思路:

    本题的重点在两两交换需要调整三个点,梳理好转换顺序就不难。最后的是为了处理只有一个元素的特殊情况

    代码:

        def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
    
            if not head: return head
    
            prev, cur, ans = None, head, head.next
    
            while cur and cur.next:
    
                adj = cur.next
    
                if prev: prev.next = adj
     
    
                cur.next, adj.next = adj.next, cur
    
                prev, cur = cur, cur.next
    
    
            return ans or head
  • 相关阅读:
    可视化XHTML编辑器
    诺基亚E63内存清理法
    C语言第0次作业
    C语言博客作业03函数
    C博客作业01分支、顺序结构
    C语言博客作业02循环结构
    心情随笔
    沉没成本
    检索了MEG 和EEG,以及棘波的论文
    解决投稿问题
  • 原文地址:https://www.cnblogs.com/baihualiaoluan/p/16153169.html
Copyright © 2020-2023  润新知