您的位置:首页 > 理论基础 > 数据结构算法

用java源代码学数据结构<七>: BST

2013-10-29 22:31 465 查看
/*
* 以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());
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: