新建文件
创建TreeNode类,实例化
直接在BinarySearchTree类里面写就可以
static class TreeNode {
public int key;
public TreeNode left;
public TreeNode right;
TreeNode(int key) {
this.key = key;
}
}
public TreeNode root;
插入节点 insert
public boolean insert(int key) {
TreeNode node = new TreeNode(key);
if(root==null){
//检查是否为空树
root=node;
return true;//表示成功插入
}
TreeNode cur=root;//读取根节点
TreeNode parent=null;
//查找合适的位置 如果已经有了则返回false
while(cur!=null){
if(cur.key<key){
parent=cur;
cur=cur.right;
} else if (cur.key>key) {
parent=cur;
cur=cur.left;
}else{
return false;
}
}
//插入
if(key< parent.key){
parent.left=node;
}else{
parent.right=node;
}
return true;
}
查找结点 search
找到则返回该节点,没找到返回null
public TreeNode search(int key) {
if(root==null) return null;
TreeNode cur=root;
while(cur!=null){
if(cur.key==key){
return cur;
}else if(cur.key>key){
cur=cur.left;
}else{
cur=cur.right;
}
}
return null;
}
删除节点 remove
找到节点并删除,成功则返回true,失败false
public boolean remove(int key) {
TreeNode cur=root;
TreeNode parent=null;
while(cur!=null){
if(cur.key<key){
parent=cur;
cur=cur.right;
} else if (cur.key>key) {
parent=cur;
cur=cur.left;
}else{
removeNode(parent,cur);//进行删除
return true;
}
}
return false;
}
注意,这里删除又写了一个自定义函数。已至删除的位置和其双亲结点,如何让其删除呢?
如果左右子节点都在,则用左子树的最大值或者右子树的最小值替换即可,下面给出用右子树的最小值替换的方法。
public void removeNode(TreeNode parent,TreeNode cur){
//在子树部分删除cur节点后重新构建子搜索二叉数
if(cur.left==null){
if(cur==root) root=cur.right;
if(cur==parent.left) parent.left=cur.right;
if(cur==parent.right) parent.right=cur.right;
}else if(cur.right==null){
if(cur==root) root=cur.left;
if(cur==parent.left) parent.left=cur.left;
if(cur==parent.right) parent.right=cur.left;
}else{
TreeNode target=cur.right;
TreeNode targetParent=cur;
while(target.left!=null){
targetParent=target;
target=target.left;
}
cur.key= target.key;
if(target==targetParent.left) {
targetParent.left = target.right;
}else{
targetParent.right = target.right;
}
}
}
如有什么没讲清楚的地方,欢迎留言探讨!