本文实例为大家分享了java二叉查找树的具体代码,供大家参考,具体内容如下
package 查找; import edu.princeton.cs.algs4.Queue; import edu.princeton.cs.algs4.StdOut; public class BST, Value> { private class Node { private Key key; // 键 private Value value;// 值 private Node left, right; // 指向子树的链接 private int n; // 以该节点为根的子树中的节点总数 public Node(Key key, Value val, int n) { this.key = key; this.value = val; this.n = n; } } private Node root; 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; 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.value; } public void put(Key key, Value val) { root = put(root, key, val); } private 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.value = val; x.n = size(x.left) + size(x.right); // 要及时更新节点的子树数量 return x; } public Key min() { return min(root).key; } private Node min(Node x) { if (x.left == null) return x; return min(x.left); } public Key max() { return max(root).key; } private Node max(Node x) { if (x.right == null) return x; return min(x.right); } public Key floor(Key key) { Node x = floor(root, key); if (x == null) return null; else return x.key; } private Node floor(Node x, Key key) { if (x == null) return null; int cmp = key.compareTo(x.key); if (cmp == 0) return x; else if (cmp < 0) return floor(x.left, key); else { Node t = floor(x.right, key); if (t == null) return x; else return t; } } public Key ceiling(Key key) { Node x = ceiling(root, key); if (x == null) return null; else return x.key; } private Node ceiling(Node x, Key key) { if (x == null) return null; int cmp = key.compareTo(x.key); if (cmp == 0) return x; else if (cmp > 0) { return ceiling(x.right, key); } else { Node t = floor(x.left, key); if (t == null) return x; else return t; } } public Key select(int k) { return select(root, k).key; } 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 int rank(Key key) { return rank(key, root); } 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); } 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 deleteMax(){ root = deleteMax(root); } private Node deleteMax(Node x){ if(x.right == null ) return x.left; x.right = deleteMax(x.right); 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 t = x; x = min(t.right); x.left = t.left; x.right = deleteMin(t.right); } x.n = size(x.left) + size(x.right) +1; return x; } public void print(){ print(root); } private void print(Node x){ if(x == null ) return; print(x.left); StdOut.println(x.key); print(x.right); } public Iterable keys(){ return keys(min(),max()); } public Iterable keys(Key lo, Key hi){ Queue queue = new Queue (); keys(root, queue, lo, hi); return queue; } private void keys(Node x, Queue queue, Key lo, Key hi){ if(x == null) return; int cmplo = lo.compareTo(x.key); int cmphi = lo.compareTo(x.key); if(cmplo < 0 ) keys(x.left,queue,lo,hi); if(cmplo <= 0 && cmphi >= 0) queue.enqueue(x.key); if(cmphi > 0 ) keys(x.right,queue,lo,hi); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。



