shz.core.st.tst.ITST Maven / Gradle / Ivy
package shz.core.st.tst;
import shz.core.queue.a.IArrayQueue;
import shz.core.stack.l.LLinkedStack;
import java.util.Collections;
import java.util.function.Predicate;
/**
* 值为int类型的TST
*
* 8+48*n(n为元素个数)
*
* B=24+48*n
*/
public class ITST extends TST {
/**
* 4+27+对齐填充=32
*
* B=48
*/
protected static final class Node extends TST.Node {
public int val;
public Node(char c) {
super(c);
}
}
protected ITST() {
}
public static ITST of() {
return new ITST();
}
public final void put(char[] a, int val) {
root = put(root, a, val, 0);
}
protected final Node put(Node x, char[] a, int val, int d) {
if (x == null) x = new Node(a[d]);
if (a[d] < x.c) x.left = put(x.left, a, val, d);
else if (a[d] > x.c) x.right = put(x.right, a, val, d);
else if (d < a.length - 1) x.mid = put(x.mid, a, val, d + 1);
else {
x.val = val;
x.leaf = true;
}
return x;
}
public final Integer get(char[] a) {
Node x = get(root, a, 0);
return x == null || !x.leaf ? null : x.val;
}
public final Iterable getAll() {
return get(root, false);
}
protected final Iterable get(Node x, boolean prefix) {
if (x == null) return Collections.emptyList();
IArrayQueue queue = IArrayQueue.of();
LLinkedStack stack = LLinkedStack.of();
if (x.mid != null) stack.push(x.mid);
if (!prefix) {
if (x.left != null) stack.push(x.left);
if (x.right != null) stack.push(x.right);
}
while (stack.size() > 0) {
Node pop = stack.pop();
if (pop.leaf) queue.offer(pop.val);
push(stack, pop);
}
return queue.isEmpty() ? Collections.emptyList() : queue;
}
private void push(LLinkedStack stack, Node x) {
if (x.left != null) stack.push(x.left);
if (x.mid != null) stack.push(x.mid);
if (x.right != null) stack.push(x.right);
}
public final Iterable getByPrefix(char[] prefix) {
return get(get(root, prefix, 0), true);
}
public final Iterable getChars(Predicate predicate, int limit) {
return getChars0(x -> predicate == null || predicate.test(x.val), limit);
}
}