二叉查找树

import java.util.Random;

public class BST<Key extends Comparable<Key>,Value> {
	
	private Node root;
	private class Node{
		private Key key;
		private Value val;
		private Node left,right;
		private int N;
		public Node(Key key,Value val,int N){
			this.key=key;
			this.val=val;
			this.N=N;
		}
	}

	public int size() { return size(root); }
	private int size(Node x){
		if(x==null) return 0;
		else return x.N;
	}
	
	public Value get(Key key){
		return get(root,key);
	}
	private Value get(Node x,Key key){
		if(x==null) return null;
		//System.out.println(x.val);
		int cmp=key.compareTo(x.key);
		if(cmp<0) return get(x.left,key);
		else if(cmp>0) return get(x.right,key);
		else return x.val;
	}
	
	public void put(Key key,Value val){
		root=put(root,key, val);
	}
	public Node put(Node x,Key key,Value val){
		if(x==null) return new Node(key, val, 1);
		int cmp=key.compareTo(x.key);
		if(cmp<0) x.left=put(x.left,key,val);
		else if(cmp>0) x.right=put(x.right, key, val);
		else x.val=val;
		
		x.N=size(x.left)+size(x.right)+1;
		return x;
	}
	
	private Node min(Node x){
		if(x.left==null) return x;
		else return min(x.left);
	}
	
	public void deleteMin(){
		root=deleteMin(root);
	}
	private Node deleteMin(Node x){
		if(x.left==null) return x.right;
		x.left=deleteMin(x.left);
		x.N=size(x.left)+size(x.right)+1;
		return x;
	}
	
	public void delete(Key key){
		root=delete(root,key);
	}
	private Node delete(Node x,Key key){
		if(x==null) return null;
		int cmp=key.compareTo(x.key);
		if(cmp<0) x.left=delete(x.left, key);
		else if(cmp>0) x.right=delete(x.right, key);
		else{
			if(x.right==null) return x.left;
			if(x.left==null) return x.right;
			Node tNode=x;
			x=min(x.right);
			x.right=deleteMin(tNode.right);
			x.left=tNode.left;
		}
		x.N=size(x.left)+size(x.right)+1;
		return x;
	}
	
	public void PrevOrder(Node x){
		if(x==null) return;
		System.out.print(x.key+": "+x.val+"->");
		PrevOrder(x.left);
		PrevOrder(x.right);
	}
	public void InOrder(Node x){
		if(x==null) return;
		PrevOrder(x.left);
		System.out.print(x.key+": "+x.val+"->");
		PrevOrder(x.right);
	}
	public void PostOrder(Node x){
		if(x==null) return;
		PrevOrder(x.left);
		PrevOrder(x.right);
		System.out.print(x.key+": "+x.val+"->");
	}
	
	public static void main(String[] args) {
		BST<Integer, String> tree=null;
		tree=new BST<Integer,String>();
		for(int i=0;i<10;i++){
			tree.put(i*i-4*i,"value="+i);
		}
		tree.PrevOrder(tree.root);
		System.out.println();
		tree.InOrder(tree.root);
		System.out.println();
		tree.PostOrder(tree.root);
		System.out.println();
		
		tree.delete(0);
		tree.PrevOrder(tree.root);
		System.out.println();
		tree.delete(21);
		tree.PrevOrder(tree.root);
		System.out.println();
		tree.delete(45);
		tree.PrevOrder(tree.root);
		System.out.println();
	}

}
/*test
0: value=4->-3: value=3->-4: value=2->5: value=5->12: value=6->21: value=7->32: value=8->45: value=9->
-3: value=3->-4: value=2->0: value=4->5: value=5->12: value=6->21: value=7->32: value=8->45: value=9->
-3: value=3->-4: value=2->5: value=5->12: value=6->21: value=7->32: value=8->45: value=9->0: value=4->
5: value=5->-3: value=3->-4: value=2->12: value=6->21: value=7->32: value=8->45: value=9->
5: value=5->-3: value=3->-4: value=2->12: value=6->32: value=8->45: value=9->
5: value=5->-3: value=3->-4: value=2->12: value=6->32: value=8->
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值