// Ukkonen tree must contain an end symbol as last symbol static IntSuffixTree_managed ukkonenToIntSuffixTree_managed(UkkonenIntSuffixTree uTree) { new IntSuffixTree_managed tree; tree.mem.onMemorySizeChanged = r { tree.mem.printStats(); }; int lText = l(uTree.text)-1; int endSymbol = uTree.text[lText]; printVars_str(+lText, +endSymbol); tree.fullText = wrapIntArrayAsImmutableList(uTree.text); new HashMap nodeMap; // First round: copy all nodes for (int uNodeIdx : recursiveIterator(uTree.root, n -> values(uTree.nodes[n].next))) { UkkonenIntSuffixTree.Node uNode = uTree.nodes[uNodeIdx]; IntSuffixTree_managed.Node node = tree.newNode(uNode.start, min(lText, uNode.end)); nodeMap.put(uNodeIdx, node); if (tree.root == null) tree.root = node; } // Second round: Add edges for (int idx, IntSuffixTree_managed.Node node : nodeMap) { //if (idx == endSymbol) continue; UkkonenIntSuffixTree.Node uNode = uTree.nodes[idx]; //print("Node " + idx + " children: " + uNode.next); node.setChildren(tree, mapValuesToList(uNode.next, iChild -> nodeMap.get(iChild))); } ret tree; }