用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 本周学习了无向图.有向图.带权图.常用的图算法.图的实现策略. 教材学 ...
随机推荐
- “无法在web服务器上启动调试,不是Debugger User组成员..."
在使用VS.net2003开发asp.net项目时,有时候在你调试项目时,会提示”无法在web服务器上启动调试,不是Debugger User组成员..."这样一个错误信息.很是让人头疼,一 ...
- Java学习笔记(十四)——Java静态工厂
[前面的话] 每天过的还行,对我来说,只要让自己充实,生活就会是好的. 学习Java工场方法的原因是最近在使用Spring框架做一个系统,其中有一个注入的方法是使用静态工场方法注入,所以学习一下,基础 ...
- Linux让程序后台运行命令之screen与nohup
一.nohup nohup时间长了会断掉 所以建议使用screen nohup 命令 & 如果运行成功刚默认会将标准输出重定向到当前目录的nohup.out文件中,查看此文件,可以了解运行的 ...
- KMS使用CLion作为IDE来调试
KMS使用CLion作为IDE来调试,打开kms相应模块的目录,CLion自动识别相应的CMakeLists.txt. 然而会make失败,经搜索,看到Clion使用的自带的cmake,因此系统中安装 ...
- Python函数式编程——map()、reduce()
文章来源:http://www.pythoner.com/46.html 提起map和reduce想必大家并不陌生,Google公司2003年提出了一个名为MapReduce的编程模型[1],用于处理 ...
- python的vim的环境配置(后续慢慢补充进来)
#vim ~/.vimrc set smartindent set smarttab set expandtab set tabstop= set softtabshtop= set shiftwid ...
- Centos的 mysql for python的下载与安装
mysql-python的安装包下载地址:http://sourceforge.net/projects/mysql-python/files/latest/download linux环境是 Cen ...
- 【线段树】Mayor's posters
[poj2528]Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 66154 Accept ...
- ES6 函数参数的默认值
基本用法 在ES6之前,不能直接为函数的参数指定默认值,只能采取变通的方法. function log(x,y){ y = y||'world'; console.log(x,y); } log('k ...
- MYSQL5上运行多个实例
date 20131005参考http://chenzehe.iteye.com/blog/1266260官方文档 http://dev.mysql.com/doc/refman/5.1/zh/dat ...