//定义结点类型
class Node{
Object obj;
Node left;
Node right;
public Node(Object obj,Node left,Node right){
this.obj=obj;
this.left=left;
this.right=right;
}
} //插入一个元素,插入成功则返回true 失败则返回false
@Override
public boolean insert(Object obj) {
Node rt=root,pt=null;
while(rt!=null){
pt=rt;//把上一个结点给记录上
if((Integer)(rt.obj)>(Integer)obj){
rt=rt.left;
}else if((Integer)(rt.obj)<(Integer)obj){
rt=rt.right;
}else{
return false;
}
}
Node node=new Node(obj,null,null);//新建一个结点
if(pt==null){
root=node;
}else if((Integer)(pt.obj)<(Integer)obj){
pt.right=node;
}else{
pt.left=node;
}
return true;
}
//查找一个元素 找到则会返回该元素,找不到不会有任何返回
@Override
public Object find(Object obj) {
if(root==null) return null;
Node rt=root;
while(rt!=null){
if((Integer)(rt.obj)>(Integer)obj){
rt=rt.left;
}else if((Integer)(rt.obj)<(Integer)obj){
rt=rt.right;
}else{
return rt.obj;
}
}
return null;
}
//从二叉搜索树中删除一个结点,分为三类
//1、删除叶子结点;2、删除单支结点;3、删除双支结点
@Override
public boolean delete(Object obj) {
//从二叉搜索树中删除等于给定值的obj的结点,成功则返回true,失败则返回false
if(root==null){
return false;
}
Node rt=root,pt=null;
while(rt!=null){
if((Integer)(rt.obj)==(Integer)obj){
break;
}else if((Integer)(rt.obj)>(Integer)obj){
pt=rt;
rt=rt.left;
}else {
pt=rt;
rt=rt.right;
}
}
if(rt==null) return false;//如果没找到该元素的话,返回空
//分三种情况删除以查找到的结点 rt
//删除叶子结点
if(rt.left==null && rt.right==null){//删除叶子结点,直接删除操作
if(rt==root) root=null;
else if(pt.left==rt) pt.left=null;
else pt.right=null;
}
//删除rt结点为单分支时的情况处理
else if(rt.left==null || rt.right==null){
if(rt==root){//先处理rt是根节点的情况
if(rt.left==null) root=rt.right;
else root=rt.left;
}else if(pt.left==rt && rt.left==null){//处理单支结点,分为四种情况
pt.left=rt.right;
}else if(pt.left==rt && rt.right==null){
pt.left=rt.left;
}else if(pt.right==rt && rt.left==null){
pt.right=rt.right;
}else if(pt.right==rt && rt.right==null){
pt.right=rt.left;
}else ;
}
//处理都有双子树的结点
else if(rt.left!=null && rt.right!=null){
Node s1=rt,s2=rt.left;
while(s2.right!=null){
s1=s2;s2=s2.right;
}
rt.obj=s2.obj;//把中序前驱结点s2的值赋给rt结点
if(s1==rt){//对rt的中序前驱结点就是rt的左孩子的情况进行处理
rt.left=s2.left;
}else{//对rt的中序前驱结点为其左海子的右子树的情况来处理
s1.right=s2.left;
}
}
return true;//删除成功后返回
}
输出搜索二叉树代码如下: //输出二叉树
public void inOrderTravers(Node node){
if(node!=null){
inOrderTravers(node.left);
System.out.print(node.obj+" ");
inOrderTravers(node.right);
}else;
} 原文:http://blog.csdn.net/xxniuren/article/details/52370271