现在的位置: 首页 > 综合 > 正文

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

2018年03月20日 ⁄ 综合 ⁄ 共 2136字 ⁄ 字号 评论关闭
/*
 * 以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());
	}
	
	

}

抱歉!评论已关闭.