一、669. 修剪二叉搜索树
题目链接:669. 修剪二叉搜索树 - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)——669. 修剪二叉搜索树
视频讲解:你修剪的方式不对,我来给你纠正一下!| LeetCode:669. 修剪二叉搜索树_哔哩哔哩_bilibili
思路:通过递归,当前层的子树直接返回上一层。
# 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]:
# 2. 终止条件
if root == None:
return None
# 当前节点值小于边界,需要删除,但是右子树可能符合需要,并将其返回给其父节点
if root.val < low:
right = self.trimBST(root.right, low, high)
return right
# 当前节点值大于边界,需要删除,但是左子树可能符合需要,并将其返回给其父节点
if root.val > high:
left = self.trimBST(root.left, low, high)
return left
# 3. 单层递归逻辑
# 左
root.left = self.trimBST(root.left, low, high)
# 右
root.right = self.trimBST(root.right, low, high)
return root
二、108.将有序数组转换为二叉搜索树
题目链接:108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)——108.将有序数组转换为二叉搜索树
视频讲解:构造平衡二叉搜索树!| LeetCode:108.将有序数组转换为二叉搜索树_哔哩哔哩_bilibili
思路:选数组中中心节点作为根节点,左边作为左子树,右边作为右子树。当数组长度为偶数时,左右节点都可以,只是结构略有不同。
# 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:
# 1. 确定递归函数的参数和返回值,区间左闭右闭
def traversal(self, nums, left, right):
# 2. 确定终止条件,left大于right为非法区间,取等的话可能是合法区间,相等的值可能是根节点
if left > right:
return None
# 3. 确定单层递归的逻辑
# 确定中间值
mid = left + (right - left) // 2
root = TreeNode(nums[mid])
# 构造左子树
root.left = self.traversal(nums, left, mid - 1)
# 构造右子树
root.right = self.traversal(nums, mid + 1, right)
return root
def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
root = self.traversal(nums, 0, len(nums) - 1)
return root
三、538.把二叉搜索树转换为累加树
题目链接:538. 把二叉搜索树转换为累加树 - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)——538.把二叉搜索树转换为累加树
视频讲解:普大喜奔!二叉树章节已全部更完啦!| LeetCode:538.把二叉搜索树转换为累加树_哔哩哔哩_bilibili
思路:双指针法。右中左遍历,降序排列,cur和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 traversal(self, cur):
# 2. 确定终止条件
if not cur:
return
# 3. 单层递归逻辑,右中左
# 右
self.traversal(cur.right)
# 中
cur.val += self.pre
self.pre = cur.val
# 左
self.traversal(cur.left)
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
# 记录前一个节点值
self.pre = 0
self.traversal(root)
return root