目录
一、Leetcode235. 二叉搜索树的最近公共祖先
题目描述
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]

题目链接:力扣题目链接
解题思路
- 最近公共祖先一定在p和q之间!!!
方法:递归法
- 终止条件:遇到空节点返回None
- 单层递归:大于p,q向左遍历,小于p,q向右遍历
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if not root:
return None
if root.val > p.val and root.val > q.val:
return self.lowestCommonAncestor(root.left, p, q)
if root.val < p.val and root.val < q.val:
return self.lowestCommonAncestor(root.right, p, q)
return root
总结
- 二叉搜索树的公共祖先处于p和q之间!!!
二、Leetcode701.二叉搜索树中的插入操作
题目描述
给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。
注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。


题目链接:力扣题目链接
解题思路
- 大了就往右,小了就往左,遇到空节点就插入
方法:递归法
- 终止条件:遇到空节点就插入
- 单层递归:大了就往右递归,小了就往左递归
- (递归时就要建立连接root.left/root.right,插入时直接返回新的节点!!)
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
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)
if val > root.val:
root.right = self.insertIntoBST(root.right, val)
return root
总结
- 二叉搜索树的插入,最简单的是插入叶子节点(遇到空节点就插入!)
三、Leetcode450.删除二叉搜索树中的节点
题目描述
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。


题目链接:力扣题目链接
解题思路
- 删除的节点需要分情况讨论!!!
1、无删除节点
2、叶子节点
3、只有左节点
4、只有右节点
5、有左右节点
方法:递归法
- 终止条件有五种情况:
1、遇到空节点返回None
遇到值相等时:
2、叶子节点返回None
3、只有左节点,返回左节点
4、只有右节点,返回右节点
5、有左右节点,需要将左子树放到右子树中最左的叶子节点上面,返回右节点 - 单层递归:找小的往左递归,找大的往右递归
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:
# 终止条件有五种情况
# 1.遇到空节点
if not root:
return None
if key == root.val:
# 2.删除叶子节点
if not root.left and not root.right:
return None
# 3.只有左子树或者只有右子树
elif not root.left:
return root.right
elif not root.right:
return root.left
# 4.有左右子树
else:
cur = root.right
while cur.left:
cur = cur.left
cur.left = root.left
return root.right
if key < root.val:
root.left = self.deleteNode(root.left, key)
if key > root.val:
root.right = self.deleteNode(root.right, key)
return root
总结
- 二叉搜索树的删除比较难,分情况写终止条件!!!
- 二叉搜索的遍历都是,找小的往左遍历,找大的往右遍历
心得:到Day22,二叉搜索树最近公共祖先的特性要记住(pq之间),插入比较简单,可以直接插入叶子节点,删除比较复杂需要分5种情况,还是有点难…加油!
本文详细解析了LeetCode中的三个二叉搜索树相关问题:235-最近公共祖先使用递归法解决,701-插入操作通过大了往右小了往左进行,450-删除节点涉及五种情况的递归处理。作者强调了这些操作的特点和递归策略。

被折叠的 条评论
为什么被折叠?



