Example #1
0
        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));
            }
        }
Example #2
0
        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);
            }
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }
Example #5
0
 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;
     }
 }
Example #6
0
        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);
            }
        }
Example #7
0
 private static bool IsNodeHaveNoChildren(TernaryTrieNode <TValue> node)
 {
     return(node.Left == null && node.Middle == null && node.Right == null);
 }
Example #8
0
 private static bool IsNodeEmpty(TernaryTrieNode <TValue> node)
 {
     return(!node.IsNodeValueSet && IsNodeHaveNoChildren(node));
 }