1、删除二分搜索树的最大元素
(1)寻找二分搜索树的最大元素
//先找到最大节点
T maxNodeVal =findmaxnodeDG();
if (maxNodeVal==null){
System.out.println("isEmpty");
return ;
}
(2)返回以node为根的二分搜索树的最大值所在的节点
if (node.right==null){
//进行删除操作
Node leftNode =node.left;
node.left =null;
return leftNode;
}
node.right =removeMaxNode(node.right);
return node;
2、删除二分搜索树的最小元素
同理,
//删除最小元素
private void removeMixNode(){
//先找到最小节点
T minNodeVal =findminnodeDG();
if (minNodeVal==null){
System.out.println("isEmpty");
return ;
}
System.out.println(minNodeVal.toString());
//进行删除操作
root= removeMixNode(root);
}
private Node removeMixNode(Node node) {
if (node.left==null){
//进行删除操作
Node rightNode =node.right;
node.right =null;
return rightNode;
}
node.left =removeMixNode(node.left);
return node;
}
1、删除二分搜索树的任意元素
(1)左右节点都为空
delNode=null;
(2)左节点不为空,右节点为空
leftNode =delNode.left;
delNode.left = null;
return leftNode;
(3)右节点不为空,左节点为空
rightNode =delNode.right;
delNode.right = null;
return rightNode;
(4)左右节点都不为空
//左右节点都不为空
//1、找node 的后继(node.right中的最小节点)
Node t = findminnodeDG(node.right);
//2、node.right 中删除最小节点
Node node1 = removeMixNode(node.right);
//3、使用后继节点替换node
t.left =node.left;
t.right =node1;
//4、生成新树,新树的根节点就是后继节点,返回新树根节点
node.left=node.right=null; //断开删除节点的左右节点
return t;
/删除任意节点
public T removeNode(T val){
//判断根是否为0
if (root==null){
System.out.println("根为0");
return null;
}
//不为零,则需要查找节点
Node node=findNodeDG(root,val);
if (node!=null){
//删除节点
root= removeNode(root,val);
return node.val;
}
return null;
}
/**
* 从以root为根的二分搜索树中删除值为val的节点
* @param node
* @param val
* @return
*/
private Node removeNode(Node node,T val){
//递归到底的情况,找到了删除的节点
//左节点为空,右节点为空,左右节点都为空
if (node.val.compareTo(val)==0){
if (node.left==null){
Node rightNode =node.right;
node.right =null;
return rightNode;
}else if (node.right==null){
Node leftNode =node.left;
node.left =null;
return leftNode;
}else {
//左右节点都不为空
//1、找node 的后继(node.right中的最小节点)
Node t = findminnodeDG(node.right);
//2、node.right 中删除最小节点
Node node1 = removeMixNode(node.right);
//3、使用后继节点替换node
t.left =node.left;
t.right =node1;
//4、生成新树,新树的根节点就是后继节点,返回新树根节点
node.left=node1=null;
return t;
}
}
//递归操作
if (node.val.compareTo(