From
Leetcode
Status
AC
Date
Mar 4, 2024
Tags
二叉搜索树
Difficulty
中等
题面
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
- 首先找到需要删除的节点;
- 如果找到了,删除它。
示例 1:
示例 2:
示例 3:
提示:
- 节点数的范围
[0, 10
4
]
.
10
5
<= Node.val <= 10
5
- 节点值唯一
root
是合法的二叉搜索树
10
5
<= key <= 10
5
思路
- 确定递归函数的返回值和参数
- 确定终止条件:遇到空返回,没有找到要删除的节点,遇到空直接返回。删除节点的逻辑就在终止条件里(找到要删的点)。
- 第一种情况:没找到删除的节点,遍历到空节点直接返回了
- 找到删除的节点
- 第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
- 第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点
- 第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
- 第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。
有以下五种情况:
- 单步递归逻辑