669.修剪二叉搜索树
递归
返回条件有三个,当走到None的时候直接返回,如果结点的值小于左边界,则返回结点的右结点,但是右结点也可能有小于左边界的值,因此实际返回的是进入递归修剪后的右子树;右边界同理。迭代主体则是结点的左右子结点各自进入递归。
class Solution:
def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:
if root == None:
return root
if root.val < low:
return self.trimBST(root.right, low, high)
if 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
迭代
迭代的比较麻烦,一开始要对根节点额外处理(因为根节点没有前置结点),如果根节点数值大于左边界则直接取右结点(左子树的值一定都小于根节点),大于右边界同理。然后再从移动后的根节点开始,对根节点的左右子树做删减,如果左结点值小于左边界,直接指向左结点的右子树,并且一直向左下角迭代,直到最左下角的值也大于左边界,右结点同理。
class Solution:
def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:
if not root:
return root
while root and (root.val < low or root.val > high):
if root.val < low:
root = root.right
else:
root = root.left
cur = root
while cur:
while cur.left and cur.left.val < low:
cur.left = cur.left.right
cur = cur.left
cur = root
while cur:
while cur.right and cur.right.val > high:
cur.right = cur.right.left
cur = cur.right
return root
108.将有序数组转换为二叉搜索树
递归
每次都用数组中间的元素作为中间结点(如果是偶数则统一用右边的),然后把这个元素左边的数组和右边的数组切片分别进入递归生成改结点的左右子树。
class Solution:
def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
if not nums:
return None
l = len(nums)//2
mid = TreeNode(nums[l])
mid.left = self.sortedArrayToBST(nums[:l])
mid.right = self.sortedArrayToBST(nums[l+1:])
return mid
538.把二叉搜索树转换为累加树
递归
一个右中左的中序遍历,只要做一个全局变量保存当前的总和,让当前结点值加上这个总和就可以了。
class Solution:
def __init__(self):
self.sum_ = 0
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
self.traversal(root)
return root
def traversal(self, root):
if not root:
return
self.traversal(root.right)
root.val += self.sum_
self.sum_ = root.val
self.traversal(root.left)
迭代
一样的思路
class Solution:
def __init__(self):
self.sum_ = 0
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
stack = []
cur = root
while cur or stack:
if cur:
stack.append(cur)
cur = cur.right
else:
cur = stack.pop()
cur.val += self.sum_
self.sum_ = cur.val
cur = cur.left
return root