二叉搜索树2

接上篇

//二叉查找树中max()、 min()、floor()、ceiling()方法的实现
		private Node min(Node x) {
			if(x.left == null) {
				return x;
			}
			return min(x.left);
		}
		public Key min() {
			return min(root).key;
		}
		private Node floor(Node x, Key key) {
			if(x == null) {
				return null;
			}
			int cmp = key.compareTo(x.key);
			if(cmp == 0) {
				return x;
			}
			if(cmp < 0) {
				return floor(x.left,key);
			}
			Node t = floor(x.right,key);
			if(t != null) {
				return t;
			}else {
				return x;
			}
		}
		public Key floor(Key key) {
			Node x = floor(root, key);
			if(x == null) {
				return null;
			}
			return x.key;
		}
//二叉查找树中select()和rank()方法的实现
		//返回排名为k的节点
		private Node select(Node x, int k) {
			if(x == null) {
				return null;
			}
			int t = size(x.left);
			if(t > k) {
				return select(x.left, k);
			}else if(t < k) {
				return select(x.right, k-t-1);
			}else {
				return x;
			}
		}
		public Key select(int k) {
			return select(root,k).key;
		}
		//返回以x为根节点的子树中小于x.key的键的数量
		private int rank(Key key, Node x) {
			if(x == null) {
				return 0;
			}
			int cmp = key.compareTo(x.key);
			if(cmp < 0) {
				return rank(key, x.left);
			}else if(cmp > 0) {
				return 1 + size(x.left) + rank(key, x.right);
			}else {
				return size(x.left);
			}
		}
		
//二叉查找树中delete()方法的实现
		
		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 deleteMin() {
			root = deleteMin(root);
		}
		
		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 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;
		}

参考自《算法(第四版)》韦恩
代码链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值