链接: https://leetcode.cn/problems/delete-node-in-a-bst/
题意
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变
解法
一开始想了很久一直想不到解题的思路
后来经过仔细分析搜索树的性质想到
如果要删除一个节点 它一定是某棵子树的根节点
左子树中所有节点小于它,同时小于所有右子树上的节点
那么可以把它的左节点或右节点都可以作为新的根节点
如果把左节点设为新的根,则需要把左节点的右节点进行处理(移到右子树中的最左边)
反之,需要把右节点的左节点进行处理(移到左子树的最右边)
写出了一串很长的代码,新定义了四个函数
重新思考后,写出了简化后的版本,细节见代码
6.2 update
305打卡计划今天出了这一题
回过头看原先的代码觉得写的过分繁琐
在题解中找到一份简洁的实现
如果当前节点是要删除的节点
在其左子树中可以找出一个最大的(也就是最右边的节点)node
右子树中的所有元素一定都比它大
把整个右子树搬到node右边仍然满足bst的性质
再把原节点的左子节点当作新的根结点即可
但是如果要多次删除,可能会产生高度不平衡问题
but这样代码实现起来简单
代码
1 | class Solution { |
简洁版
1 | class Solution { |