/*
* 以int类为例
* 其它的类必须能够比较
* */ //二叉搜索树的节点点
class BSTNode{ int item;
BSTNode lc;
BSTNode rc;
BSTNode p; public BSTNode(int item){
this.item = item;
}
} public class BST{ //BST的根
transient BSTNode root; //树的大小
transient int size = 0; public BST(){
root = null;
} public BST(int rootData){
root = new BSTNode(rootData);
size++;
} //向二叉树搜索树中插入一个节点
private void addNode(BSTNode z){
if (root==null) {
root = z;
return;
}
BSTNode y = null;
BSTNode x = root;
while(x!=null){
//用y来保存x
y = x;
//找到z应该放置的位置
if(z.item < x.item)
x = x.lc;
else
x = x.rc;
}
z.p = y;
//如果y为null表示root为空
if (y==null) {
root = z;
return;
}
else {
//比较y和z,来设置y的lc和rc
if (z.item < y.item)
y.lc = z;
else
y.rc = z;
}
size++; } //找到BST中第一个元素为item的对象,从x节点开始找
private BSTNode findNodeByitem(BSTNode x,int item){
while (x!=null && x.item!=item) {
if (item < x.item)
x = x.lc;
else
x = x.rc;
}
return x;
} private BSTNode minimum(BSTNode x){
if (x==null) {
return null;
}
while (x.lc!=null) {
x = x.lc;
}
return x;
} private BSTNode maximum(BSTNode x){
if (x==null) {
return null;
}
while (x.rc!=null) {
x = x.rc;
}
return x;
}
private void transPlant(BSTNode u,BSTNode v){
if (u.p==null) {
root = v;
}
else {
if (u==u.p.lc) {
u.p.lc = v;
}
else {
u.p.rc = v;
}
}
if (v!=null) {
v.p = u.p;
}
} //删除x节点
private void removeNode(BSTNode z){
if (z==null) {
return;
}
if (z.lc==null) {
transPlant(z, z.rc);
}
else {
if (z.rc==null) {
transPlant(z, z.lc);
}
else {
BSTNode y = minimum(z.rc);
if (y.p!=z) {
transPlant(y, y.rc);
y.rc = z.rc;
y.rc.p = y;
}
transPlant(z, y);
y.lc = z.lc;
y.lc.p = y;
}
}
size--;
} private BSTNode getNodeByitem(int item){
return findNodeByitem(root, item);
} public void addItem(int item){
BSTNode t = new BSTNode(item);
addNode(t);
} public void removeItem(int item){
BSTNode tBstNode = findNodeByitem(root, item);
removeNode(tBstNode);
} public int getMax(){
return maximum(root).item;
} public int getMin(){
return minimum(root).item;
} private void print(BSTNode x){
if (x==null) {
return ;
}
print(x.lc);
System.out.print("["+x.item+"]");
print(x.rc);
} public void printAll(){
if (root==null) {
return;
}
print(root);
} public static void main(String[] args) {
BST bst = new BST();
bst.addItem(15);
bst.addItem(6);
bst.addItem(18);
bst.addItem(3);
bst.addItem(7);
bst.addItem(17); bst.printAll();
System.out.println(); bst.removeItem(6);
bst.printAll();
System.out.println(); bst.removeItem(10);
bst.printAll();
System.out.println(); System.out.println("Max="+bst.getMax());
System.out.println("Min="+bst.getMin());
} }

用java源代码学数据结构<七>: BST的更多相关文章

  1. 20172328 2018-2019《Java软件结构与数据结构》第七周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第七周学习总结 概述 Generalization 本周学习了第11章:二叉查找树.在本章中,主要探讨了二叉查找树的概念和 ...

  2. 20172305 2018-2019-1 《Java软件结构与数据结构》第七周学习总结

    20172305 2018-2019-1 <Java软件结构与数据结构>第七周学习总结 教材学习内容总结 本周内容主要为书第十一章内容: 二叉查找树(附加属性的二叉树) 二叉查找树是对树中 ...

  3. 20172306 2018-2019-2 《Java程序设计与数据结构》第七周学习总结

    20172306 2018-2019-2 <Java程序设计与数据结构>第七周学习总结 教材学习内容总结 概述 二叉查找树是一种含有附加属性的二叉树,即其左孩子小于父结点,而父结点又小于或 ...

  4. 20172306 《Java程序设计与数据结构》第七周学习总结

    20172306<Java程序设计>第七周学习总结 教材学习内容总结 这一章的标题是继承.主要学习了有关继承的相关知识.其中在这五节中,我学到了以下几点: 1.继承主要表达的是" ...

  5. 2018-2019-20172329 《Java软件结构与数据结构》第七周学习总结

    2018-2019-20172329 <Java软件结构与数据结构>第七周学习总结 教材学习内容总结 <Java软件结构与数据结构>第十一章-二叉查找树 一.概述 1.什么是二 ...

  6. 2018-2019-20172321 《Java软件结构与数据结构》第七周学习总结

    2018-2019-20172321 <Java软件结构与数据结构>第七周学习总结 教材学习内容总结 第11章 二叉查找树 一.概述 二叉查找树是一种含有附加属性的二叉树,该属性即其左孩子 ...

  7. 201871010128-杨丽霞《面向对象程序设计(java)》第七周学习总

    201871010128-杨丽霞-<面向对象程序设计(java)>第七周学习总结 项目 内容 这个作业属于哪个课程  https://www.cnblogs.com/nwnu-daizh/ ...

  8. 20145320 《Java程序设计》第七周学习总结

    20145320 <Java程序设计>第七周学习总结 教材学习内容总结 13章 时间与日期 时间的度量: 格林威治标准时间(GMT时间),现已不作为标准时间使用. 世界时(UT),秒的单位 ...

  9. 20172328 2018-2019《Java软件结构与数据结构》第九周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第九周学习总结 概述 Generalization 本周学习了无向图.有向图.带权图.常用的图算法.图的实现策略. 教材学 ...

随机推荐

  1. 微信小程序-二维码汇总

    小程序二维码在生活中的应用场景很多,比如营销类一物一码,扫码开门,扫码付款等...小程序二维码分两种? 1.普通链接二维码 即跟普通的网站链接生成的二维码是一个意思,这种二维码的局限性如下: 对于普通 ...

  2. webpack分离第三方库(CommonsChunkPlugin并不是分离第三方库的好办法DllPlugin科学利用浏览器缓存)

    webpack算是个磨人的小妖精了.之前一直站在glup阵营,使用browserify打包,发现webpack已经火到爆炸,深怕被社区遗落,赶紧拿起来把玩一下.本来只想玩一下的.尝试打包了以后,就想启 ...

  3. 六十二 Web开发 使用模板

    Web框架把我们从WSGI中拯救出来了.现在,我们只需要不断地编写函数,带上URL,就可以继续Web App的开发了. 但是,Web App不仅仅是处理逻辑,展示给用户的页面也非常重要.在函数中返回一 ...

  4. CentOS7网络自动连接

    1)在root用户下使用命令"vim /etc/sysconfig/network-scripts/ifcfg-XXX",其中"ifcfg-XXX"的" ...

  5. Flask实战第49天:cms轮播图管理页面布局

    新建cms_banners.html继承cms_base.html {% extends 'cms/cms_base.html' %} {% block title %} 轮播图管理-CMS管理系统 ...

  6. Spring的Web服务

    Spring支持:使用JAX-RPC暴露服务,访问Web服务 除了上面所说的支持方法,你还可以用XFire xfire.codehaus.org 来暴露你的服务.XFire是一个轻量级的SOAP库,目 ...

  7. 关于使用jqmobi前端框架在phonegap平台上开发时的日期时间选择控件

    jqmobi(appframework)作为Intel的一款html5移动前端框架,以其自身轻量级和容易上手获得了很多移动HTML5开发者的喜爱,相对于jquerymobile,它可以说将jQuery ...

  8. Funny Car Racing CSU - 1333 (spfa)

    There is a funny car racing in a city with n junctions and m directed roads. The funny part is: each ...

  9. 函数的扩展--ES6

    箭头函数 由于大括号被解释为代码块,所以如果箭头函数直接返回一个对象,必须在对象外面加上括号. var f = () => ({a:1}); f(); // 返回 {a: 1} 若写成: var ...

  10. java-多线程-一道阿里面试题分析

    这段代码大多数情况下运行正常,但是某些情况下会出问题.什么时候会出现什么问题?如何修正?可见博客 http://yueyemaitian.iteye.com/blog/1387901 1.public ...