752 字
4 分钟
代码随想录算法训练营第十七天 | 二叉树 Part07

235. 二叉搜索树的最近公共祖先#

LeetCode 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. 二叉搜索树中的插入操作#

LeetCode 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. 删除二叉搜索树中的节点#

LeetCode 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/
作者
Jarrett
发布于
2025-06-30
许可协议
CC BY-NC-SA 4.0