• 用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());
    	}
    	
    	
    
    }


  • 相关阅读:
    水平时间轴 html + css
    position:fixed 属性在iphone 中不起作用
    placeholer 换行
    单选 复选按钮 样式
    vux 中popup 组件 Mask 遮罩在最上层问题的解决
    vux 表单提交数据 返回后页面跳转
    前端 js 发送验证码
    前端 js 实现简单 表单提交
    vux 获取后台数据
    装饰模式之AOP之动态改变参数,和原函数绑定属性丢失
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3395510.html
Copyright © 2020-2023  润新知