669. 修剪二叉搜索树
思路
思路感觉很难描述清楚,对于递归的代码我只觉得写得很巧妙,但是感觉自己想是想不出来的。
需要重温此链接。
如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。
如果root(当前节点)的元素大于high的,那么应该递归左子树,并返回左子树符合条件的头结点。
接下来要将下一层处理完左子树的结果赋给root->left,处理完右子树的结果赋给root->right。
最后返回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 > high:
return self.trimBST(root.left, low, high)
elif root.val < low:
return self.trimBST(root.right, low, high)
# 返回和连接
root.left = self.trimBST(root.left, low, high)
root.right = self.trimBST(root.right, low, high)
return root
108.将有序数组转换为二叉搜索树
思路
nums
中点位置为root,nums[:mid]
为root.left
, nums[mid+1:]
为root.right
。递归建树。
代码
# 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
538.把二叉搜索树转换为累加树
思路
反序中序遍历。依次累加。
代码
递归
# 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]:
prev = None
def helper(root):
nonlocal prev
if not root:
return None
helper(root.right)
if prev:
root.val += prev.val
prev = root
else:
prev = root
helper(root.left)
helper(root)
return root
总结
精美图一张