752 字
4 分钟
代码随想录算法训练营第十七天 | 二叉树 Part07
235. 二叉搜索树的最近公共祖先
class Solution: # 相对于二叉树的最近公共祖先,这里可以使用二叉搜索树的性质来简化查找过程 # 如果 p 和 q 的值都小于 root 的值,则最近公共祖先在左子树中 # 如果 p 和 q 的值都大于 root 的值,则最近公共祖先在右子树中 # 如果 p 和 q 的值分别在 root 的两侧,或者一个等于 root 的值,则 root 就是最近公共祖先 def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': if not root: return None # 为了避免 p.val > q.val 的情况,我们可以保证 p.val <= q.val if p.val > q.val: return self.lowestCommonAncestor(root, q, p) # 当前 root 在 p 和 q 之间,说明就是最近公共祖先 if root.val >= p.val and root.val <= q.val: return root # 如果当前节点值大于 q 的值,则公共祖先一定在左子树 if root.val > q.val: return self.lowestCommonAncestor(root.left, p, q) # 否则公共祖先一定在右子树 else: return self.lowestCommonAncestor(root.right, p, q)
701. 二叉搜索树中的插入操作
class Solution: # 二叉搜索树的插入操作 # 如果当前节点为空,则创建一个新节点并返回 # 如果当前节点的值大于要插入的值,则递归到左子树 # 如果当前节点的值小于或等于要插入的值,则递归到右子树 # 最终返回根节点 def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]: if not root: return TreeNode(val) if root.val > val: root.left = self.insertIntoBST(root.left, val) else: root.right = self.insertIntoBST(root.right, val) return root
450. 删除二叉搜索树中的节点
class Solution: # 二叉搜索树的删除操作有三种情况: ## 1. 如果要删除的节点没有子节点,直接删除该节点 ## 2. 如果要删除的节点只有一个子节点,用该子节点替代当前节点 ## 3. 如果要删除的节点有两个子节点,找到右子树的最小节点,将其值替换到当前节点,然后递归删除右子树中的最小节点 # 注意:在删除操作中,需要保持二叉搜索树的性质,即左子树的值小于根节点的值,右子树的值大于根节点的值 def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]: if not root: return None if root.val == key: # 情况1:左子树为空,返回右子树 if not root.left: return root.right # 情况2:右子树为空,返回左子树 if not root.right: return root.left # 情况3:左右子树都不为空 # 找到右子树中最小的节点 node = self.getMin(root.right) # 用该最小节点替换当前节点 root.val = node.val # 删除右子树中已替换的那个节点 root.right = self.deleteNode(root.right, node.val) elif root.val > key: root.left = self.deleteNode(root.left, key) else: root.right = self.deleteNode(root.right, key) return root
# 获取以 root 为根的树中最小值节点 def getMin(self, root: TreeNode) -> TreeNode: while root.left: root = root.left return root
代码随想录算法训练营第十七天 | 二叉树 Part07
https://fuwari.vercel.app/posts/code_musings_day_seventeen/