一支穿云箭_斌
2016-08-22 16:55
万一删除的不是树叶而是中间的某一个内点,这样删除结点不用把其整个子树给删除掉吗?
在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;
}
那数组中不应该也要考虑这种情况吗
在删除节点时,如果二叉树是以链表的方式存储的,那么删除结点将一起把该结点以及结点的整个子树全部删除。
数据结构探险之树篇
56467 学习 · 116 问题
相似问题