题目链接
英文链接:https://leetcode.com/problems/delete-node-in-a-bst/
中文链接:https://leetcode-cn.com/problems/delete-node-in-a-bst/
题目详述
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
- 首先找到需要删除的节点;
- 如果找到了,删除它。
说明: 要求算法时间复杂度为 O(h),h 为树的高度。
示例:
1 | root = [5,3,6,2,4,null,7] |
题目详解
删除的结点可能是叶子结点、具有一个孩子的结点、具有两个孩子的结点这三种情况。
- 叶子结点:可以直接删除。
- 具有一个孩子的结点:删除时让它的父结点指向它的指针指向这个孩子。
- 具有两个孩子的结点:可以用前驱结点取代它,也可以用后继结点取代它。
注意删除时,被删除节点要通知它的父结点(调整指针)。
- 以下是用后继结点取代被删除结点的代码。
1 | public class LeetCode_00450 { |
如果允许直接修改结点的值,那么可以用修改结点值的方式来达到删除结点的目的,写起来更简单。
1 | public class LeetCode_00450 { |