今天都是关于二叉搜索树的操作,比普通二叉树的操作容易很多。
235. 二叉搜索树的最近公共祖先
递归法:
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if root.val > p.val and root.val > q.val: #说明pq都在root的左子树里
return self.lowestCommonAncestor(root.left, p, q)
if root.val < p.val and root.val < q.val: #说明pq都在root的右子树里
return self.lowestCommonAncestor(root.right, p, q)
return root #说明pq分别在root的左右子树里
迭代法:
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
while True:
if root.val > p.val and root.val > q.val:
root = root.left
elif root.val < p.val and root.val < q.val:
root = root.right
else:
return root
701.二叉搜索树中的插入操作
递归法:
class Solution:
def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
if not root:
node = TreeNode(val)
return node
if val < root.val:
root.left = self.insertIntoBST(root.left, val)
if val > root.val:
root.right = self.insertIntoBST(root.right, val)
return root
450.删除二叉搜索树中的节点
class Solution:
def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:
if not root:
return None
if root.val == key:
if not root.left: ##要删除的节点无左子树
return root.right
if not root.right: #要删除的节点无右子树
return root.left
#要删除的节点即有右子树,也有左子树
#找要删除的节点的右子节点的最左子节点cur,因为这个点刚好比要删除的点大一点
cur = root.right
while cur.left:
cur = cur.left
cur.left = root.left #把要删除的节点的左子树挂到cur的左边
root = root.right #让要删除的节点的根节点指向其右子节点,达到删除效果
elif key < root.val:
root.left = self.deleteNode(root.left, key)
else:
root.right = self.deleteNode(root.right, key)
return root