shz.core.st.tst.ZTST Maven / Gradle / Ivy
package shz.core.st.tst;
import shz.core.queue.a.LArrayQueue;
import shz.core.queue.a.ZArrayQueue;
import shz.core.stack.l.LLinkedStack;
/**
* 值为boolean类型的TST
*
* 8+48*n(n为元素个数)
*
* B=24+48*n
*/
public class ZTST extends TST {
private static final long serialVersionUID = 4517674923588819876L;
/**
* 1+27+对齐填充=32
*
* B=48
*/
protected static final class Node extends TST.Node {
private static final long serialVersionUID = 5181970577416496985L;
public boolean val;
public Node(char c) {
super(c);
}
}
public static ZTST of() {
return new ZTST();
}
public final void put(char[] a, boolean val) {
root = put(root, a, val, 0);
}
protected final Node put(Node x, char[] a, boolean 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 Boolean get(char[] a, int n) {
Node x = get(root, a, n);
return x == null || !x.leaf ? null : x.val;
}
public final Boolean get(char[] a) {
return get(a, a.length);
}
public final ZArrayQueue getAll() {
return get(root, false);
}
protected final ZArrayQueue get(Node x, boolean prefix) {
ZArrayQueue queue = ZArrayQueue.of();
if (x != null) {
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.isEmpty()) {
Node pop = stack.pop();
if (pop.leaf) queue.offer(pop.val);
push(stack, pop);
}
}
return 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 ZArrayQueue getByPrefix(char[] prefix) {
return get(get(root, prefix, 0), true);
}
public final LArrayQueue getChars(Boolean predicate, int limit) {
return getChars0(x -> predicate == null || predicate == x.val, limit);
}
}