二叉查找树

<span style="font-size:18px;">import java.util.LinkedList;

/**
 * 二叉查找树的实现,每个方法都有一个私有的方法
 * @author xxxu
 *
 */
public class BST {
	private Node root=null;
	
	private class Node{
		private Integer key; //键
		private String val;  //值
		private Node left;   //左节点
		private Node right;  //右节点
		private int N;       //以该节点为根的子树中的节点总数(包括自身)
		
		public Node(Integer key,String val,int N){
			this.key=key;
			this.val=val;
			this.N=N;
		}
	}
	
	public int size(){
		return size(root);
	}
	/**
	 * 统计该节点下一共有多少节点(包括自己)
	 * @param x
	 * @return
	 */
	private int size(Node x) {
		if(x==null){
			return 0;
		}else{
			return x.N;
		}
	}
	
	public String get(Integer key){
		return get(root,key);
	}
	/**
	 * 获取键对应的值
	 * @param x
	 * @param key
	 * @return
	 */
	private String get(Node x, Integer key) {
		if(x==null){
			return null;
		}
		if(key<x.key){
			return get(x.left,key);
		}else if(key>x.key){
			return get(x.right,key);
		}else{
			return x.val;
		}
	}
	
	public void put(Integer key,String val){
		root=put(root,key,val);
	}
	/**
	 * 如果key存在于以x为根节点的子树中则更新它的值
	 * 否则将以key和val为键值对的新结点插入到该子树中
	 * @param x
	 * @param key
	 * @param val
	 * @return
	 */
	private Node put(Node x, Integer key, String val) {
		if(x==null){
			return new Node(key,val,1);
		}
		if(key<x.key){
			x.left=put(x.left, key, val);
		}else if(key>x.key){
			x.right=put(x.right,key,val);
		}else{
			x.val=val;
		}
		x.N=size(x.left)+size(x.right)+1;
		return x;
	}
	/**
	 * 返回最小的键
	 * @return
	 */
	public Integer min(){
		return min(root).key;
	}
	
	private Node min(Node x) {
		if(x.left==null){
			return x;
		}
		return min(x.left);
	}
	
	public Integer max(){
		return max(root).key;
	}
	
	private Node max(Node x) {
		if(x.right==null){
			return x;
		}
		return max(x.right);
	}

	public void deleteMin(){
		root=deleteMin(root);
	}
	/**
	 * 删除最小的键
	 * @param x
	 * @return
	 */
	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(Integer key){
		root=delete(root,key);
	}
	/**
	 * 删除全是递归,理解起来有点费劲,仔细揣摩,用笔画图帮助理解
	 * @param x
	 * @param key
	 * @return
	 */
	private Node delete(Node x, Integer key) {
		if(x==null){
			return null;
		}
		if(key<x.key){
			x.left=delete(x.left,key);
		}else if(key>x.key){
			x.right=delete(x.right,key);
		}else{
			if(x.right==null){
				return x.left;
			}
			if(x.left==null){
				return x.right;
			}
			Node t=x;
			x=min(t.right);  //找出删除节点的右节点最小的节点,替换到删除的节点上
			x.right=deleteMin(t.right);//既然替换到删除的节点上,那么这个节点就要删除
			x.left=t.left;
		}
		x.N=size(x.left)+size(x.right)+1;
		return x;
	}
	
	public void zhongPrint(){
		zhongPrint(root);
		System.out.println();
	}
	/**
	 * 中序遍历
	 * @param x
	 */
	private void zhongPrint(Node x) {
		if(x==null){
			return;
		}
		zhongPrint(x.left);
		System.out.print(x.val+" ");
		zhongPrint(x.right);
	}

	public void qianPrint(){
		qianPrint(root);
		System.out.println();
	}
	/**
	 * 前序遍历
	 * @param x
	 */
	private void qianPrint(Node x) {
		if(x==null){
			return;
		}
		System.out.print(x.val+" ");
		qianPrint(x.left);
		qianPrint(x.right);
	}

	public void houPrint(){
		houPrint(root);
		System.out.println();
	}
	/**
	 * 后序遍历
	 * @param x
	 */
	private void houPrint(Node x) {
		if(x==null){
			return;
		}
		houPrint(x.left);
		houPrint(x.right);
		System.out.print(x.val+" ");
	}
	
	public void guangDuPrint(){
		guangDuPrint(root);
		System.out.println();
	}
	/**
	 * 利用链表进行广度(宽度)遍历
	 * @param x
	 */
	private void guangDuPrint(Node x) {
		if(x==null){
			return;
		}
		LinkedList<Node> linkedList=new LinkedList<Node>();
		linkedList.add(x);
		while(linkedList.size()>0){
			Node y=linkedList.poll();
			if(y!=null){
				System.out.print(y.key+" ");
			}
			if(y.left!=null){
				linkedList.add(y.left);
			}
			if(y.right!=null){
				linkedList.add(y.right);
			}
		}
	}
}</span>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值