private void remove()

in java/src/main/java/com/epam/deltix/containers/AvlTree.java [250:392]


    private void remove(AvlTreeNode<TKey, TValue> node, TKey keyToRemove, AvlTreeNode<TKey, TValue> parent)
    {
        if (keyToRemove.compareTo(node.key) == 0)
        {
            if (node.left == null)
            {
                if (parent == null)
                {

                    if(node.right != null) prev[node.right.index] = -1;

                    root = node.right;
                }
                else if (parent.left == node)
                {
                    if(node.right != null && prev[node.right.index] == node.index)
                    {
                        prev[node.right.index] = prev[node.index];
                        if(prev[node.index] != -1)
                            next[prev[node.index]] = node.right.index;
                    }

                    if (prev[parent.index] == node.index)
                    {
                        prev[parent.index] = prev[node.index];
                        if(prev[node.index] != -1)
                            next[prev[node.index]] = parent.index;
                    }

                    parent.left = node.right;

                }
                else
                {
                    if(node.right != null && prev[node.right.index] == node.index)
                    {
                        prev[node.right.index] = prev[node.index];
                        if(prev[node.index] != -1)
                            next[prev[node.index]] = node.right.index;
                    }

                    if (next[parent.index] == node.index)
                    {
                        next[parent.index] = next[node.index];
                        if(next[node.index] != -1)
                            prev[next[node.index]] = parent.index;
                    }

                    parent.right = node.right;

                }
                next[node.index] = -1;
                prev[node.index] = -1;
                values.set(node.index, null);
                keys.set(node.index, null);
                freeIndexes[++freeIndexesHead] = node.index;
                avlTreeNodeAPMemoryManager.delete(node);
            }
            else if (node.right == null)
            {
                if (parent == null)
                {
                    next[node.left.index] = next[root.index];

                    root = node.left;
                }
                else if (parent.left == node)
                {
                    if(next[node.left.index] == node.index)
                    {
                        next[node.left.index] = next[node.index];
                        if(next[node.left.index] != -1)
                            prev[next[node.left.index]] = node.left.index;
                    }

                    if (prev[parent.index] == node.index)
                    {
                        prev[parent.index] = prev[node.index];
                        if(prev[node.index] != -1)
                            next[prev[node.index]] = parent.index;
                    }

                    parent.left = node.left;
                }
                else
                {
                    if(next[node.left.index] == node.index)
                    {
                        next[node.left.index] = next[node.index];
                        if(next[node.left.index] != -1)
                            prev[next[node.left.index]] = node.left.index;
                    }

                    if (next[parent.index] == node.index)
                    {
                        next[parent.index] = next[node.index];
                        if(next[node.index] != -1)
                            prev[next[node.index]] = parent.index;
                    }

                    parent.right = node.left;
                }
                next[node.index] = -1;
                prev[node.index] = -1;
                values.set(node.index, null);
                keys.set(node.index, null);
                freeIndexes[++freeIndexesHead] = node.index;
                avlTreeNodeAPMemoryManager.delete(node);
            }
            else
            {
                AvlTreeNode<TKey, TValue> tempNode = node.left;
                while (tempNode.right != null)
                    tempNode = tempNode.right;

                node.value = tempNode.value;
                node.key = tempNode.key;
                keys.set(node.index, node.key);
                values.set(node.index, node.value);

                tempNode.key = keyToRemove;
                remove(node.left, keyToRemove, node);

                rightFix(node, parent);
            }
        }
        else if (keyToRemove.compareTo(node.key) < 0)
        {
            if (node.left != null)
            {
                remove(node.left, keyToRemove, node);
                rightFix(node, parent);
            }
        }
        else
        {
            if (node.right != null)
            {
                remove(node.right, keyToRemove, node);
                leftFix(node, parent);
            }
        }
    }