二叉树数组实现中删除结点函数的问题
万一删除的不是树叶而是中间的某一个内点,这样删除结点不用把其整个子树给删除掉吗?
万一删除的不是树叶而是中间的某一个内点,这样删除结点不用把其整个子树给删除掉吗?
2016-08-22
在Tree类中定义一个void DiGui(int nodeIndex);方法来递归删除左右节点:
void Tree::DiGui(int nodeIndex)
{
int currentNodeIndex = nodeIndex;
if(nodeIndex * 2 + 1 < m_iSize)
{
nodeIndex = nodeIndex * 2 + 1;
m_pTree[nodeIndex] = 0;
DiGui(nodeIndex);
}
if(currentNodeIndex * 2 + 2 < m_iSize)
{
currentNodeIndex = currentNodeIndex * 2 + 2;
m_pTree[currentNodeIndex] = 0;
DiGui(currentNodeIndex);
}
}
在bool DeleteNode(int nodeIndex, int *pNode);方法中实现:
bool Tree::DeleteNode(int nodeIndex, int *pNode)
{
if (nodeIndex < 0 || nodeIndex >= m_iSize)
{
return false;
}
if (m_pTree[nodeIndex] == 0)
{
return false;
}
*pNode = m_pTree[nodeIndex];
m_pTree[nodeIndex] = 0;
DiGui(nodeIndex);
return true;
}
嗯,支持哈。。。我直接在DeleteNode()函数中加了个递归去做了。
//删除结点
bool Tree::DeleteNode(int nodeIndex, int &node)
{
if (nodeIndex < 1 || nodeIndex > m_iSize)
{
return false; //位置异常
}
if (NODENULL == m_pTree[nodeIndex])
{
return false; //结点不存在
}
node = m_pTree[nodeIndex];
m_pTree[nodeIndex] = NODENULL;
//将该结点的子结点都置空,递归删除左孩子和右孩子
int temp = 0;
DeleteNode(nodeIndex * 2, temp);
DeleteNode(nodeIndex * 2 + 1, temp);
return true;
}
举报