235. 二叉搜索树最近公共祖先
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if not root:
return root
left = self.lowestCommonAncestor(root.left, p , q)
right = self.lowestCommonAncestor(root.right, p , q)
if root.val > p.val and root.val > q.val:
return left
elif root.val < p.val and root.val < q.val:
return right
else:
return root
遍历的时候,如果节点的值大于p,q的值就返回左子树,小于就返回右子树,如果正好在p,q的值中间,就返回当前节点,说明找到了。
701. 二叉搜索树插入
class Solution:
def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
if not root:
node = TreeNode(val)
return node
if root.val > val:
root.left = self.insertIntoBST(root.left,val)
if root.val < val:
root.right = self.insertIntoBST(root.right,val)
return root
遍历到空的时候作节点插入
此时直接返回插入的节点,然后被下面接住,如果是val小于root.val 那么让root.left等于返回的结果; 如果val大于root.val 就让root.right 等于返回的结果
450. 二叉搜索树删除节点
class Solution:
def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:
if not root:
return root
if root.val == key:
if not root.left and not root.right: #左右都为空的叶子节点,直接返回None
return root.left
elif not root.left and root.right: # 左空 右不空,返回右
return root.right
elif root.left and not root.right: # 右空 左不空
return root.left
else: # 左右都不空
cur = root.right
while cur.left:
cur = cur.left
cur.left = root.left
return root.right
if root.val > key:
root.left = self.deleteNode(root.left, key)
if root.val < key:
root.right = self.deleteNode(root.right, key)
return root
考虑四种情况:
1. 左右都为空的叶子节点,直接返回None到上一层,让父节点接住
2. 左为空或者右为空,返回不为空的节点
3. 左右都不为空:首先将左子树移到右子树最左侧节点的下面,然后按左为空右不为空处理,返回右节点