235. 二叉搜索树的最近公共祖先
递归:
一般写法:
先复习一下昨天的写法:
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if not root or root == p or root == q:
return root
left = self.lowestCommonAncestor(root.left, p, q)
right = self.lowestCommonAncestor(root.right, p, q)
if left and right:
return root
return left if left else right
利用二叉搜索树的性质:
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if root.val > p.val and root.val > q.val:
return self.lowestCommonAncestor(root.left, p, q)
elif root.val < p.val and root.val < q.val:
return self.lowestCommonAncestor(root.right, p, q)
else:
return root
迭代:
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
cur = root
while cur:
if cur.val > p.val and cur.val > q.val:
cur = cur.left
elif cur.val < p.val and cur.val < q.val:
cur = cur.right
else:
return cur
701. 二叉搜索树中的插入操作
递归:
总能在叶子节点找到插入位置。
class Solution:
def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
if not root:
return TreeNode(val)
if val < root.val:
root.left = self.insertIntoBST(root.left, val)
else:
root.right = self.insertIntoBST(root.right, val)
return root
迭代:
class Solution:
def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
if not root: return TreeNode(val)
cur = root
while cur:
if val < cur.val and cur.left:
cur = cur.left
elif val > cur.val and cur.right:
cur = cur.right
elif val < cur.val and not cur.left:
cur.left = TreeNode(val)
return root
elif val > cur.val and not cur.right:
cur.right = TreeNode(val)
return root
450. 删除二叉搜索树中的节点
class Solution:
def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:
if not root:
return root
# 如果key小于root.val,去左子树删除
if key < root.val:
root.left = self.deleteNode(root.left, key)
# 如果key大于root.val,去右子树删除
elif key > root.val:
root.right = self.deleteNode(root.right, key)
else:
# 如果当前节点是要删除的节点
# 情况1:节点是叶子节点,可以直接删除
if not root.left and not root.right:
root = None
# 情况2:节点只有一个子节点,用子节点替换当前节点
elif root.left and not root.right:
root = root.left
elif root.right and not root.left:
root = root.right
# 情况3:节点有两个子节点
else:
# 找到右子树的最小节点
min_node = root.right
while min_node.left:
min_node = min_node.left
# 替换当前节点的值为右子树最小节点的值
root.val = min_node.val
# 删除右子树中的最小节点
root.right = self.deleteNode(root.right, root.val)
return root