插入数据
boolean put(int val){//二叉搜索树插入数据
if(root==null){
root = new BSTNode(val);
return true;
}
BSTNode cur = root;
BSTNode temp = cur;
while (cur!=null){
if(val<cur.val){
temp = cur;
cur = cur.left;
}else if(val>cur.val){
temp=cur;
cur = cur.right;
}else {
return true;
}
}
if(temp.val>val){//这里需注意
temp.left = new BSTNode(val);return true;
}else{
temp.right = new BSTNode(val);return true;
}
}
以上圈住部分有逻辑漏洞
查找数据
boolean contains(int val){
if(root==null){
return false;
}
BSTNode cur = root;
while (cur!=null){
if(val<cur.val){
cur = cur.left;
}else if(val>cur.val){
cur = cur.right;
}else {
return true;
}
}
return false;
}
此部分相对比较简单
删除数据
难点思路
//cur的左右孩子均存在的话
//在cur子树中找一个替代的节点删除
//方式一:在其右子树中找最小的节点:即最左侧节点
//方式二:在其左子树中找最大的节点:即最右侧节点
我自己想了两种办法(cur的左右孩子均存在)
一种是将删除节点的左子树替换为该节点,将他的右子树放在左子树最右的节点下
一种是将删除节点的右子树替换为该节点,将他的右左子树放在右子树最左的节点下
//这种思路我没有去实现,因为这种思路会加深树的深度
boolean remove(int val){
if(root==null){
return false;
}
BSTNode cur = root;
BSTNode temp = cur;
while (cur!=null){
if(val<cur.val){
temp = cur;
cur = cur.left;
}else if(val>cur.val){
temp = cur;
cur = cur.right;
}else {
if(cur.left==null&&cur.right==null){//删除的是叶子节点
if(cur==root){//要删除的是根节点
root = null;
return true;
}
if(temp.left==cur){
temp.left=cur.left;
}else {
temp.right=cur.right;
}
return true;
}else if(cur.right!=null&&cur.left==null){//删除节点无左子树
if(cur==root) {//要删除的是根节点
System.out.println(root.val);
root = root.right;
System.out.println(root.val);
return true;
}
if(temp.right==cur){
temp.right = cur.right;return true;
}else {
temp.left = cur.right;return true;
}
}else if(cur.right==null&&cur.left !=null){//删除节点无右子树
if(cur==root){//要删除的是根节点
root = root.left;
return true;
}
if(temp.right==cur){
temp.right = cur.left;return true;
}else {
temp.left = cur.left;return true;
}
}else {//删除节点左右子树都有
BSTree left = new BSTree();
left.root = cur.left;
int n = left.maxNode().val;
remove(n);
cur.val =n;
return true;
/* BSTree right = new BSTree();
right.root = cur.right;
int n = right.minNode().val;
remove(n);
cur.val = n;
return true;*/
}
}
}
return false;
}