private int Search(TernaryTrieNode <TValue> node, string query, int levelCounter, int prefixLength) { if (node == null) { return(prefixLength); } char character = query[levelCounter]; if (character < node.Character) { return(Search(node.Left, query, levelCounter, prefixLength)); } else if (character > node.Character) { return(Search(node.Right, query, levelCounter, prefixLength)); } else { if (node.IsNodeValueSet) { prefixLength = levelCounter; } return(Search(node.Middle, query, levelCounter + 1, prefixLength)); } }
private TernaryTrieNode <TValue> Get(TernaryTrieNode <TValue> node, string key, int levelCounter) { if (node == null) { return(null); } var character = key[levelCounter]; if (character < node.Character) { return(Get(node.Left, key, levelCounter)); } else if (character > node.Character) { return(Get(node.Right, key, levelCounter)); } else if (levelCounter < key.Length - 1) { return(Get(node.Middle, key, levelCounter + 1)); } else { return(node); } }
private TernaryTrieNode <TValue> Put(TernaryTrieNode <TValue> node, string key, TValue value, int levelCounter) { var character = key[levelCounter]; if (node == null) { node = new TernaryTrieNode <TValue>(character); } if (character < node.Character) { node.Left = Put(node.Left, key, value, levelCounter); } else if (character > node.Character) { node.Right = Put(node.Right, key, value, levelCounter); } else if (levelCounter < key.Length - 1) { node.Middle = Put(node.Middle, key, value, levelCounter + 1); } else { if (!node.IsNodeValueSet) { Size++; } node.Value = value; } return(node); }
private void Collect(TernaryTrieNode <TValue> node, string prefix, IList <string> queue) { if (node == null) { return; } Collect(node.Left, prefix, queue); char character = node.Character; if (node.IsNodeValueSet) { queue.Add(prefix + character); } Collect(node.Middle, prefix + character, queue); Collect(node.Right, prefix, queue); }
private static void SetChildToNull(TernaryTrieNode <TValue> parent, TernaryTrieNode <TValue> child) { if (parent == null) { return; } if (parent.Left == child) { parent.Left = null; } if (parent.Middle == child) { parent.Middle = null; } if (parent.Right == child) { parent.Right = null; } }
private TernaryTrieNode <TValue> Delete(TernaryTrieNode <TValue> node, string key, int levelCounter) { if (node == null) { return(null); } var character = key[levelCounter]; if (character < node.Character) { var childNode = Delete(node.Left, key, levelCounter); if (childNode != null && IsNodeEmpty(childNode)) { SetChildToNull(node, childNode); } return(node); } else if (character > node.Character) { var childNode = Delete(node.Right, key, levelCounter); if (childNode != null && IsNodeEmpty(childNode)) { SetChildToNull(node, childNode); } return(node); } else if (levelCounter < key.Length - 1) { var childNode = Delete(node.Middle, key, levelCounter + 1); if (childNode != null && IsNodeEmpty(childNode)) { SetChildToNull(node, childNode); } return(node); } else { node.ClearNodeValue(); Size--; return(node); } }
private static bool IsNodeHaveNoChildren(TernaryTrieNode <TValue> node) { return(node.Left == null && node.Middle == null && node.Right == null); }
private static bool IsNodeEmpty(TernaryTrieNode <TValue> node) { return(!node.IsNodeValueSet && IsNodeHaveNoChildren(node)); }