java :非递归方法的二叉搜索树,实现部分功能
2016-05-10 21:37
489 查看
//
//实现了如下功能
public class BinarySearchTree { /** * * @author Administrator *嵌套类构造结点 * @param <Integer> */ private static class BinaryNode<Integer>{ public Integer data; public BinaryNode<Integer> lchild; public BinaryNode<Integer> rchild; public BinaryNode(Integer d,BinaryNode<Integer> l,BinaryNode<Integer> r){ this.data = d; this.lchild = l; this.rchild = r; } } //根节点 private BinaryNode<Integer> root; public BinarySearchTree(){ root = null; } /** * 返回根节点 * @param x * @param r * @return */ public BinaryNode<Integer> add(Integer x,BinaryNode<Integer> r){ BinaryNode<Integer> tmp = r; BinaryNode<Integer> p = new BinaryNode<Integer>(x,null,null); if(r == null){ r = p; }else{ while(tmp.lchild!=p && tmp.rchild != p){ if(x<tmp.data){ if(tmp.lchild == null){ tmp.lchild = p; }else{ tmp = tmp.lchild; } }else if(x>tmp.data){ if(tmp.rchild == null){ tmp.rchild = p; }else{ tmp = tmp.rchild; } } } } return r; } /** * 返回最小的结点 * @param r * @return */ public BinaryNode<Integer> findMin(BinaryNode<Integer> r){ if(r != null){ while(r.lchild != null){ r = r.lchild; } } return r; } /** * 返回最大的结点 * @param r * @return */ public BinaryNode<Integer> findMax(BinaryNode<Integer> r){ if(r != null){ while(r.rchild != null){ r = r.rchild; } } return r; } //删除一个节点 public BinaryNode<Integer> remove(Integer x,BinaryNode<Integer> r){ BinaryNode<Integer> tmp = r; BinaryNode<Integer> p = null ;//指示目标结点的父亲 if(r == null){ throw new NullPointerException(); } while(tmp.data != x){ if(x<tmp.data){ p = tmp; tmp = tmp.lchild; }else if(x<tmp.data){ p = tmp; tmp = tmp.rchild; } } //如果待删结点是叶子结点 if(tmp.lchild == null && tmp.rchild == null){ if(tmp == r){ tmp = null; //若为根节点,将根节点置空 }else if(p.lchild == tmp){ p.lchild = null; }else{ p.rchild = null; } }else //如果为单叶子结点 if(tmp.lchild == null || tmp.rchild == null){ if(tmp == r){ if(tmp.lchild == null){ tmp = tmp.rchild; }else if(tmp.rchild == null){ tmp = tmp.lchild; } }else if(p.lchild == tmp){ if(tmp.lchild == null){ p.lchild = tmp.rchild; }else if(tmp.rchild == null){ p.lchild = tmp.lchild; } } else if(p.rchild == tmp){ if(tmp.lchild == null){ p.lchild = tmp.rchild; }else if(tmp.rchild == null){ p.lchild = tmp.lchild; } } }else {//目标结点的子结点都不为空 BinaryNode<Integer> a = tmp ; BinaryNode<Integer> b = tmp.rchild ; while(b.lchild != null){//选右边数最小的数据 a = b; b = b.lchild; } tmp.data = b.data; if(a == tmp){ tmp.rchild = b.rchild;//若目标结点的右子结点没有左子节点 }else{ a.lchild = b.rchild; } } return r; } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树