課程
/后端開發(fā)
/C++
/數(shù)據(jù)結(jié)構(gòu)探險之樹篇
萬一刪除的不是樹葉而是中間的某一個內(nèi)點,這樣刪除結(jié)點不用把其整個子樹給刪除掉嗎?
2016-08-22
源自:數(shù)據(jù)結(jié)構(gòu)探險之樹篇 3-2
正在回答
在Tree類中定義一個void DiGui(int nodeIndex);方法來遞歸刪除左右節(jié)點:
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);方法中實現(xiàn):
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()函數(shù)中加了個遞歸去做了。
//刪除結(jié)點bool Tree::DeleteNode(int nodeIndex, int &node){?if (nodeIndex < 1 || nodeIndex > m_iSize)?{??return false; //位置異常?}?if (NODENULL == m_pTree[nodeIndex])?{??return false; //結(jié)點不存在?}?node = m_pTree[nodeIndex];?m_pTree[nodeIndex] = NODENULL;?//將該結(jié)點的子結(jié)點都置空,遞歸刪除左孩子和右孩子?int temp = 0;?DeleteNode(nodeIndex * 2, temp);?DeleteNode(nodeIndex * 2 + 1, temp);?return true;}
那數(shù)組中不應(yīng)該也要考慮這種情況嗎
在刪除節(jié)點時,如果二叉樹是以鏈表的方式存儲的,那么刪除結(jié)點將一起把該結(jié)點以及結(jié)點的整個子樹全部刪除。
舉報
樹,將為你開啟更精彩的數(shù)據(jù)結(jié)構(gòu)大門,了解更多概念
1 回答二叉樹的數(shù)組實現(xiàn)
1 回答二叉樹鏈表實現(xiàn)的問題
1 回答關(guān)于數(shù)組表示二叉樹的疑問
1 回答二叉樹的刪除操作出Bug了
2 回答C++數(shù)據(jù)結(jié)構(gòu)二叉樹,講錯了吧?
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網(wǎng)安備11010802030151號
購課補貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號
2018-06-23
在Tree類中定義一個void DiGui(int nodeIndex);方法來遞歸刪除左右節(jié)點:
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);方法中實現(xiàn):
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;
}
2016-09-04
嗯,支持哈。。。我直接在DeleteNode()函數(shù)中加了個遞歸去做了。
//刪除結(jié)點
bool Tree::DeleteNode(int nodeIndex, int &node)
{
?if (nodeIndex < 1 || nodeIndex > m_iSize)
?{
??return false; //位置異常
?}
?if (NODENULL == m_pTree[nodeIndex])
?{
??return false; //結(jié)點不存在
?}
?node = m_pTree[nodeIndex];
?m_pTree[nodeIndex] = NODENULL;
?//將該結(jié)點的子結(jié)點都置空,遞歸刪除左孩子和右孩子
?int temp = 0;
?DeleteNode(nodeIndex * 2, temp);
?DeleteNode(nodeIndex * 2 + 1, temp);
?return true;
}
2016-08-23
那數(shù)組中不應(yīng)該也要考慮這種情況嗎
2016-08-22
在刪除節(jié)點時,如果二叉樹是以鏈表的方式存儲的,那么刪除結(jié)點將一起把該結(jié)點以及結(jié)點的整個子樹全部刪除。