今天的题还是逻辑上需要想清楚,而且主要都用到了bst的inorder的性质
669. Trim a Binary Search Tree
这道题和之前的delete node的题很像,但是区别在于那道题需要考虑多种情况,但是这道题不用想的那么多
Way1:
如果比low小就返回右子树,反之返回左子树,如果符合条件,则重新建立左右子树
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)
else:
root.left=self.trimBST(root.left,low,high)
root.right=self.trimBST(root.right,low,high)
return root
108. Convert Sorted Array to Binary Search Tree
这道题有很多种解法,最简单的就是用二分法,类似于用inorder去build tree
Way1:
每次取区间的mid来作为当前的node,然后小于mid的当成左子树,剩下的当成右子树
class Solution:
def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
def convert(l,r):
if l<=r:
mid=(l+r)//2
node=TreeNode(nums[mid])
node.left=convert(l,mid-1)
node.right=convert(mid+1,r)
return node
return None
return convert(0,len(nums)-1)
538. Convert BST to Greater Tree
这道题和之前的根据inorder和postorder来建立tree是相似的,都i要考虑如果利用逆运算
Way1:
如果说inorder 就能得到单调递增的数列的话,那么这道题就是反之右val左去遍历然后改变整个树的值
class Solution:
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
self.pre=TreeNode()
def convert(node):
if not node:
return
convert(node.right)
node.val+=self.pre.val
self.pre=node
convert(node.left)
return node
return convert(root)
总结:二叉树的题普遍的还是很难的,主要需要主要的就是两点.1是要注意是否要利用返回值,二是要根据不同的tree的性质来决定使用dfs,还是bfs,如果是dfs要选择遍历的顺序