代码随想录算法训练营第二十三天 | 669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树、二叉树:总结篇

64 阅读2分钟

669. 修剪二叉搜索树

代码随想录视频讲解

代码随想录文章讲解

递归法

  • 前序遍历,如果当前节点小于low,则返回trim后的右子树;如果大于high,则返回trim后的左子树(保持BST的特性)
class Solution:
    def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:
        if not root:
            return None
​
        # root
        if root.val < low:
            return self.trimBST(root.right, low, high)
        if root.val > high:
            return self.trimBST(root.left, low, high)
        # left
        root.left = self.trimBST(root.left, low, high)
        # right
        root.right = self.trimBST(root.right, low, high)
​
        return root

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

代码随想录视频讲解

代码随想录文章讲解

递归法

  • 不断寻找list的中点作为root构造BST
class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
        if len(nums) == 0:
            return
​
        mid = len(nums) // 2
        root = TreeNode(nums[mid])
        root.left = self.sortedArrayToBST(nums[:mid])
        root.right = self.sortedArrayToBST(nums[mid+1:])
​
        return root

递归法2:使用左右指针选择BST的范围

class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
        def _helper(left, right):
            if left > right:
                return
            mid = left + (right - left) // 2
            root = TreeNode(nums[mid])
            root.left = _helper(left, mid - 1)
            root.right = _helper(mid + 1, right)
            return root
​
        return _helper(0, len(nums) - 1)

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

代码随想录文章讲解

递归法

  • 从大到小遍历BST(右中左),在当前节点之前遍历的所有节点的和+当前节点的值就是要求的新的值
class Solution:
    def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        pre = 0
​
        def _traversal(root):
            nonlocal pre
            if not root:
                return
            # right
            _traversal(root.right)
​
            # root
            root.val += pre
            pre = root.val
​
            # left
            _traversal(root.left)
​
        _traversal(root)
​
        return root

迭代法

  • 反向的中序遍历
class Solution:
    def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        if not root:
            return None
        
        stack = deque([root])
        pre = 0
        while stack:
            cur = stack.pop()
            if cur:
                # left
                if cur.left:
                    stack.append(cur.left)
                # root
                stack.append(cur)
                stack.append(None)
                # right
                if cur.right:
                    stack.append(cur.right)
            else:
                cur = stack.pop()
                cur.val += pre
                pre = cur.val
                
        return root

二叉树:总结篇

  • 涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。
  • 求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。
  • 求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。