450. 删除二叉搜索树中的节点
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。
说明: 要求算法时间复杂度为 O(h),h 为树的高度。
解题思路
先找到节点,然后根据该节点的位置来进行删除
如果为叶节点则直接删除
如果只有一个孩子节点,则孩子节点代替它
否则,需要用右子树的最左节点来替代它(或者左子树的最右节点),这里简单用改变节点值来实现,实际情况可以更改指针
运行结果
java代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
if(root == null) return null;
if(root.val == key){
//对应无孩子节点或只有一个孩子节点
if(root.left == null) return root.right;
if(root.right == null) return root.left;
//寻找右子树的最左节点来进行替代
int minval=getMin(root.right);
root.val=minval;
root.right=deleteNode(root.right,minval);
}else if(root.val > key){
root.left=deleteNode(root.left,key);
}else if(root.val < key){
root.right=deleteNode(root.right,key);
}
return root;
}
public int getMin(TreeNode node){
while(node.left != null){
node=node.left;
}
return node.val;
}
}
京公网安备 11010502036488号