用java源代码学数据结构<七>: BST
/*
* 以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的更多相关文章
- 20172328 2018-2019《Java软件结构与数据结构》第七周学习总结
20172328 2018-2019<Java软件结构与数据结构>第七周学习总结 概述 Generalization 本周学习了第11章:二叉查找树.在本章中,主要探讨了二叉查找树的概念和 ...
- 20172305 2018-2019-1 《Java软件结构与数据结构》第七周学习总结
20172305 2018-2019-1 <Java软件结构与数据结构>第七周学习总结 教材学习内容总结 本周内容主要为书第十一章内容: 二叉查找树(附加属性的二叉树) 二叉查找树是对树中 ...
- 20172306 2018-2019-2 《Java程序设计与数据结构》第七周学习总结
20172306 2018-2019-2 <Java程序设计与数据结构>第七周学习总结 教材学习内容总结 概述 二叉查找树是一种含有附加属性的二叉树,即其左孩子小于父结点,而父结点又小于或 ...
- 20172306 《Java程序设计与数据结构》第七周学习总结
20172306<Java程序设计>第七周学习总结 教材学习内容总结 这一章的标题是继承.主要学习了有关继承的相关知识.其中在这五节中,我学到了以下几点: 1.继承主要表达的是" ...
- 2018-2019-20172329 《Java软件结构与数据结构》第七周学习总结
2018-2019-20172329 <Java软件结构与数据结构>第七周学习总结 教材学习内容总结 <Java软件结构与数据结构>第十一章-二叉查找树 一.概述 1.什么是二 ...
- 2018-2019-20172321 《Java软件结构与数据结构》第七周学习总结
2018-2019-20172321 <Java软件结构与数据结构>第七周学习总结 教材学习内容总结 第11章 二叉查找树 一.概述 二叉查找树是一种含有附加属性的二叉树,该属性即其左孩子 ...
- 201871010128-杨丽霞《面向对象程序设计(java)》第七周学习总
201871010128-杨丽霞-<面向对象程序设计(java)>第七周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
- 20145320 《Java程序设计》第七周学习总结
20145320 <Java程序设计>第七周学习总结 教材学习内容总结 13章 时间与日期 时间的度量: 格林威治标准时间(GMT时间),现已不作为标准时间使用. 世界时(UT),秒的单位 ...
- 20172328 2018-2019《Java软件结构与数据结构》第九周学习总结
20172328 2018-2019<Java软件结构与数据结构>第九周学习总结 概述 Generalization 本周学习了无向图.有向图.带权图.常用的图算法.图的实现策略. 教材学 ...
随机推荐
- python中的is, ==与对象的相等判断
在java中,对于两个对象啊a,b,若a==b表示,a和b不仅值相等,而且指向同一内存位置,若仅仅比较值相等,应该用equals.而在python中对应上述两者的是‘is’ 和‘==’. (1) py ...
- redis 安装及安装遇到的问题解决
https://blog.csdn.net/jy0902/article/details/19248299 http://q.fireflyclub.org/?/article/24 https:// ...
- win 10 下面安装 mysql-8.0.12-winx64 的过程
win 10 下面安装 mysql-8.0.12-winx64 的过程 1.官网下载 mysql 2.解压到你要安装的目录 3.在mysql目录D:\Programming\mysql-8.0.12- ...
- vault-in-kubernetes
http://www.devoperandi.com/vault-in-kubernetes-take-2/ https://www.usenix.org/sites/default/files/co ...
- vmware漏洞之四:简评USE-AFTER-SILENCE: EXPLOITING A QUIETLY PATCHED UAF IN VMWARE
转:https://www.zerodayinitiative.com/blog/2017/6/26/use-after-silence-exploiting-a-quietly-patched-ua ...
- ButterKnife不同版本配置
7.0.1版本 compile 'com.jakewharton:butterknife:7.0.1' 8.0.1版本 module: apply plugin: 'com.android.appli ...
- CodeForces 738E Subordinates
排序,构造. 相当于告诉我们一棵树$n$个节点,每个节点在哪一层,至少需要移动多少个节点,才能让这些节点变成一棵树. 按照层次排个序移动一下就可以了,优先选择那些不是$s$但是层次是$0$的节点,如果 ...
- 读书笔记(高性能javascript)(二)
5. 字符串和正则表达式: (1) 在大多数浏览器中,数组项合并(Array.prototype.join)比其他字符串连接方法更慢,但它却在IE7及更早版本浏览器中合并大量字符串唯一高效的途径: ( ...
- 洛谷—— P2562 [AHOI2002]Kitty猫基因编码
P2562 [AHOI2002]Kitty猫基因编码 题目描述 小可可选修了基础生物基因学.教授告诉大家 Super Samuel 星球上 Kitty猫的基因的长度都是 2 的正整数次幂 ), 全是由 ...
- js中的property和attribute
javascript中的property和attribute虽然都被翻译为“属性”,但是他们还是有区别的. 前两天写网页时用到checkbox,就被property和attribute弄晕了好久.后来 ...