标签:
//定义结点类型 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