課程
/后端開發
/C++
/數據結構探險之樹篇
萬一刪除的不是樹葉而是中間的某一個內點,這樣刪除結點不用把其整個子樹給刪除掉嗎?
2016-08-22
源自:數據結構探險之樹篇 3-2
正在回答
在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;}
那數組中不應該也要考慮這種情況嗎
在刪除節點時,如果二叉樹是以鏈表的方式存儲的,那么刪除結點將一起把該結點以及結點的整個子樹全部刪除。
舉報
樹,將為你開啟更精彩的數據結構大門,了解更多概念
1 回答二叉樹的數組實現
1 回答二叉樹鏈表實現的問題
1 回答關于數組表示二叉樹的疑問
1 回答二叉樹的刪除操作出Bug了
2 回答C++數據結構二叉樹,講錯了吧?
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2018-06-23
在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;
}
2016-09-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
那數組中不應該也要考慮這種情況嗎
2016-08-22
在刪除節點時,如果二叉樹是以鏈表的方式存儲的,那么刪除結點將一起把該結點以及結點的整個子樹全部刪除。