/** * gets the minimum key value in the tree */ VoxelHashTree GetMinKey() { if (m_leftHashTree == null) { return(this); } else { return(m_leftHashTree.GetMinKey()); } }
/// <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)); } }