1、修剪二叉搜索树
class Solution:
def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:
if not root: 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
# 前序遍历
root.left = self.trimBST(root.left, low, high)
root.right = self.trimBST(root.right, low, high)
return root # 返回根节点
2、转换为二叉搜索树
class Solution:
def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
def helper(left, right):
if left > right: return None
mid = (left+right)//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)
3、累加树
class Solution:
def __init__(self):
self.pre = 0
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
def traversal(node):
if not node: return
# 在这里显然需要“右中左”的遍历方式,将累加和向左传递
traversal(node.right)
# 将节点的值累加
node.val += self.pre
# 更新累加和
self.pre = node.val
traversal(node.left)
traversal(root)
return root