今天的题都和BST有关,BST的性质的变换主要有两个:1. 如果是中序遍历,值一定是单调递增的.2 对于每个node来做左子树上的值一定比当前node小,右子树相反
235. Lowest Common Ancestor of a Binary Search Tree
这道题和之前的236题相似,但是区别就在于要考虑bst的性质
Way1:
考虑到bst的性质,那么只要判断是比两个值都大还是都小就可以了
如果都大就遍历左子树,如果都小则遍历右子树,其他的情况就是一定是当前的要找的node
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
def dfs(node):
if not node:
return node
if node.val > p.val and node.val > q.val:
return dfs(node.left)
if node.val < p.val and node.val < q.val:
return dfs(node.right)
else:
return node
return dfs(root)
701. Insert into a Binary Search Tree
这道题其实不用的想的很复杂,如果直接想成在tree里面的叶子节点加个node就简单很多了
Way1:
如果比node值大就遍历右边,反之遍历左边,如果当前是叶子节点,则判断一下是插左边还是右边
class Solution:
def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
def dfs(node):
if node.val > val:
if not node.left:
node.left=TreeNode(val)
else:
dfs(node.left)
if node.val < val:
if not node.right:
node.right=TreeNode(val)
else:
dfs(node.right)
if not root:
root=TreeNode(val)
return root
dfs(root)
450. Delete Node in a BST
这道题是相对来说最复杂的,需要考虑不同的情况
Way1:
如果比key比node.val大就遍历右子树,小就遍历左子树如果相等就要考虑当前node的情况了.如果当前node没有左子树,则返回右子树即可,反之返回左子树即可.如果两个树都有则需要把左子树放在右子树的最左叶子节点的下面
class Solution:
def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:
if not root:
return None
if root.val < key:
root.right=self.deleteNode(root.right,key)
elif root.val > key:
root.left=self.deleteNode(root.left,key)
else:
if not root.left:
return root.right
if not root.right:
return root.left
node=root.right
while node.left:
node=node.left
node.left=root.left
root=root.right
return root