Exemplo n.º 1
0
    /// <summary>
    /// Delete node with specific haskey from tree.
    /// </summary>
    /// <param name="hashkey">Hashkey to delete.</param>
    /// <returns>If it found a node to delete.</returns>
    public bool Delete(int hashkey)
    {
        if (hashkey == m_hashKey)
        {
            if ((m_leftHashTree != null) && (m_rightHashTree != null))
            {
                // we have left and right trees,
                // copy the right's minimum tree into this tree
                // delete from right tree
                VoxelHashTree target = m_rightHashTree.GetMinKey();
                m_voxel   = target.m_voxel;
                m_hashKey = target.m_hashKey;
                m_rightHashTree.Delete(m_hashKey);
            }
            else if (m_parentHashTree.m_leftHashTree == this)
            {
                // point parent directly at child
                // depends on GC to remove this?
                m_parentHashTree.m_leftHashTree = (m_leftHashTree != null) ? m_leftHashTree : m_rightHashTree;
            }
            else if (m_parentHashTree.m_rightHashTree == this)
            {
                // point parent directly at child
                // depends on GC to remove this?
                m_parentHashTree.m_rightHashTree = (m_leftHashTree != null) ? m_leftHashTree : m_rightHashTree;
            }

            return(true);
        }

        if (hashkey < m_hashKey)
        {
            if (m_leftHashTree == null)
            {
                return(false);
            }

            return(m_leftHashTree.Delete(hashkey));
        }
        else
        {
            if (m_rightHashTree == null)
            {
                return(false);
            }

            return(m_rightHashTree.Delete(hashkey));
        }
    }