为了账号安全,请及时绑定邮箱和手机立即绑定

二叉树数组实现中删除结点函数的问题

万一删除的不是树叶而是中间的某一个内点,这样删除结点不用把其整个子树给删除掉吗?

正在回答

4 回答

在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;
}

1 回复 有任何疑惑可以回复我~

嗯,支持哈。。。我直接在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;
}

0 回复 有任何疑惑可以回复我~

那数组中不应该也要考虑这种情况吗

0 回复 有任何疑惑可以回复我~

在删除节点时,如果二叉树是以链表的方式存储的,那么删除结点将一起把该结点以及结点的整个子树全部删除。

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

二叉树数组实现中删除结点函数的问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信