思路
给定范围要求去除二叉树中不满足范围的节点
思考对于每个节点的处理
对于当前节点,低于下界,右子树节点
如果高于上街,使用左子树节点
如果时空节点,那么返回空姐点
在考虑root节点,将root节点的左右按照规则进行修剪
根据递归的原则会进行如下的处理
先处理当前根节点,根节点处理结束以后,开始处理左右节点
递归的规则比较抽象,反复思考
关键还是抽象成最小问题来思考
代码
# 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)
elif root.val>high:
return self.trimBST(root.left,low,high)
root.left=self.trimBST(root.left,low,high)
root.right=self.trimBST(root.right,low,high)
return root
思路
根据有序数组来返回二叉搜索树,有序数组和二叉搜索树的性质有密切联系
我们使用向下取整来作为根节点
终止条件:当nums为空时返回空节点
对于根节点
把mid作为根节点
然后去处理左子树和右子树
对于左子树和右子树,分别使用nums切片左边和右边来寻找左右节点
输出一样是根节点
代码
# 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]:
if not nums:
return None
mid=len(nums)//2
root=TreeNode(nums[mid])
root.left=self.sortedArrayToBST(nums[:mid])
root.right=self.sortedArrayToBST(nums[mid+1:])
return root
思路
使用一个sum变量来储存节点值和
终止条件:节点为空
先遍历右节点
对于根节点进行如下处理:
使用sum加上当前节点值
更改节点值
处理左节点
代码
# 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 convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
self.sum=0
def dfs(node):
if not node:
return
dfs(node.right)
self.sum+=node.val
node.val=self.sum
dfs(node.left)
dfs(root)
return root