题目:
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。
说明: 要求算法时间复杂度为 O(h),h 为树的高度。
示例:

代码:
- 解法一
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
if(root==null){
return null;
}
if(root.val>key){
root.left=deleteNode(root.left,key);
}else if(root.val<key){
root.right=deleteNode(root.right,key);
}else{
if(root.left==null){
TreeNode rightNode=root.right;
root.right=null;
return rightNode;
}
if(root.right==null){
TreeNode leftNode=root.left;
root.left=null;
return leftNode;
}
//要删除的结点左右子树都有时
TreeNode newcurNode=minmum(root.right);
newcurNode.right=removeMin(root.right);
newcurNode.left=root.left;
root.left=root.right=null;
return newcurNode;
}
return root;
}
public TreeNode search(TreeNode root,int key){ //搜索元素
if(root==null){
return null;
}
if(root.val>key){
search(root.left,key);
}else if(root.val<key){
search(root.right,key);
}else{
return root;
}
return null;
}
public TreeNode minmum(TreeNode node){ //获取最小结点
if(node.left==null){
return node;
}else{
return minmum(node.left);
}
}
public TreeNode removeMin(TreeNode node){ //删除最小结点
TreeNode cur=minmum(node);
if(node.left==null){
TreeNode rightNode=node.right;
node.right=null;
return rightNode;
}
node.left=removeMin(node.left);
return node;
}
}
- 别人的代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
if(root==null) return null ;
if(root.val>key) root.left=deleteNode(root.left,key);
else if(root.val<key) root.right = deleteNode(root.right,key);
else {
if(root.left==null) return root.right;
if(root.right==null) return root.left;
TreeNode rightmin = findmin(root.right);
root.val = rightmin.val;
root.right = deleteNode(root.right,root.val);
}
return root;
}
private TreeNode findmin(TreeNode root){ //寻找最小结点
while(root.left!=null)
root=root.left;
return root;
}
}
该博客主要讲解如何在保持二叉搜索树性质不变的情况下,通过Java实现删除指定节点的操作。内容包括问题描述、删除操作的两个步骤以及解题思路和示例代码。
432

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



