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

来源:3-2 二叉树数组实现编码实战(二)

一支穿云箭_斌

2016-08-22 16:55

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

写回答 关注

4回答

  • qq_枫_142
    2018-06-23 00:40:02

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

  • 小白_ing
    2016-09-04 16:06:04

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

  • 一支穿云箭_斌
    2016-08-23 12:03:45

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

  • Milk灬浅唱
    2016-08-22 20:00:40

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

数据结构探险之树篇

树,将为你开启更精彩的数据结构大门,了解更多概念

56467 学习 · 116 问题

查看课程

相似问题