669. 修剪二叉搜索树
思路
https://programmercarl.com/0669.%E4%BF%AE%E5%89%AA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html 题目
https://leetcode.cn/problems/trim-a-binary-search-tree/
# 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)
if root.val > high: # 节点大于最大值,节点需要向左移动
return self.trimBST(root.left,low,high)
# 这里需要多次判定,在这个节点区间,不是所用节点都符合条件。
# 以下左孩子,右孩子 只返回有效节点。所以需要递归
if low <= root.val <= high: # 如果节点落在区间范围了,以下起到的是删除区间内不符合的节点
root.left = self.trimBST(root.left,low,high) # 让,满足条件的左叶子挂在该节点的左孩子上
root.right = self.trimBST(root.right,low,high)
return root
# if not root or root.val < low or root.val > high: # 终止条件
# return None
# root.right = self.trimBST(root.right,low,high)
# root.left = self.trimBST(root.left,low,high)
# 这段代码只能找到部分,节点之间还有不符合条件的点,而误删除有用的节点
# return root
108.将有序数组转换为二叉搜索树
思路
https://programmercarl.com/0108.%E5%B0%86%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E8%BD%AC%E6%8D%A2%E4%B8%BA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html题目
https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/
# 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.traversal(nums,0,len(nums)-1)
return root
def traversal(self, nums: List[int], left: int, right: int) -> TreeNode:
if left > right:
return None
mid = left + (right - left) // 2
mid_root = TreeNode(nums[mid])
mid_root.left = self.traversal(nums,left,mid-1)
mid_root.right = self.traversal(nums,mid+1,right)
return mid_root
538.把二叉搜索树转换为累加树
思路https://programmercarl.com/0538.%E6%8A%8A%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E8%BD%AC%E6%8D%A2%E4%B8%BA%E7%B4%AF%E5%8A%A0%E6%A0%91.html题目
https://leetcode.cn/problems/convert-bst-to-greater-tree/
# 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.cur = 0 # 初始化
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
if not root:
return None
self.convertBST(root.right) # 右
self.cur += root.val # 累加节点
root.val = self.cur # 把累加值赋给当前节点
self.convertBST(root.left) # 左
return root