修剪二叉搜索树

669. 修剪二叉搜索树

给你二叉搜索树的根节点 root ,同时给定最小边界 low 和最大边界 high 。通过修剪二叉搜索树,使得所有节点的值在 [low, high] 之间。修剪树 不应该 改变保留在树中的节点的相对结构(即,如果没有被移除,原有的父子关系都应当保留)。可以证明,存在 唯一的答案 。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution:
def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:
if not root:
return None
elif root.val < low:
right = self.trimBST(root.right,low,high)
return right
elif 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

如果访问节点的值在[low,high]之间,那么就递归访问左右子树。
如果节点值小于low,那么就去访问右子树,因为左子树的值一定更小。(返回右子树的根节点,并且右子树也要进行修剪)
如果节点值大于high,那么就去访问左子树,因为右子树的值一定更大。(返回左子树的根节点,并且左子树也要进行修剪)

将有序数组转换为二叉搜索树

108. 将有序数组转换为二叉搜索树

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

1
2
3
4
5
6
7
8
9
10
11
class Solution:
def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
def tra(nums,left,right):
if left > right:
return None
mid = (left + right)//2
root = TreeNode(nums[mid])
root.left = tra(nums,left,mid-1)
root.right = tra(nums,mid+1,right)
return root
return tra(nums,0,len(nums)-1)

有点类似二分法,每次取中间值作为根节点,然后递归构造左右子树。(左闭右闭)

把二叉搜索树转换为累加树

538. 把二叉搜索树转换为累加树

给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

1
2
3
4
5
6
7
8
9
10
11
class Solution:
def __init__(self):
self.pre = 0
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
if not root:
return
self.convertBST(root.right)
root.val += self.pre
self.pre = root.val
self.convertBST(root.left)
return root

采用右中左的遍历顺序,先遍历右子树,然后遍历根节点,最后遍历左子树。