所以,當我在二叉搜索樹刪除,我需要有一個像7不同的情況,即刪除在二叉搜索樹
- 左葉;
- Right Leaf;
- 左小孩只有左小孩。 //i.e要刪除的節點是其父節點的左側子節點,並且只剩下子節點。
- 左兒童只有正確的孩子。
- 右孩子只有左孩子。
- 正確的孩子只有正確的孩子。
- 要刪除的節點具有兩個孩子,即右和左。
現在,當這段代碼使用if-else
它變得非常討厭..是否有任何其他方式做到這一點。
這裏是我的代碼片段
if(current->left==NULL && current->right==NULL && current->key<prev->key) //left leaf
prev->left=NULL;
else if(current->left==NULL && current->right==NULL && current->key>prev->key) // right leaf
prev->right=NULL;
else if(current->left!=NULL && current->right==NULL && current->key<prev->key) // left child with one child
prev->left=current->left;
else if(current->left==NULL && current->right!=NULL && current->key<prev->key)
prev->left=current->right;
else if(current->left!=NULL && current->right==NULL && current->key>prev->key)
prev->right=current->left;
else if(current->left==NULL && current->right!=NULL && current->key>prev->key)
prev->right=current->left;
else if(current->left!=NULL && current->right!=NULL)
{
check=current->right;
check1=check;
while(check->left!=NULL)
{
check1=check;
check=check->left;
}
*current=*check;
check1->left=NULL;
}
說我要刪除的節點是左邊的葉子,現在在節點的父級,我需要知道它是左邊的孩子還是右邊的孩子,因爲我必須在該位置放置一個空值。所以不會我需要兩種不同的情況? – Kraken
@Karan:如果你把它推出來,是的,但是我試圖提出的一點是將這些細節抽象出來,並將實際的刪除侷限於這三種情況。有關示例,請參閱編輯答案。 –
也許我可以遍歷,直到只有父母,然後檢查它的子節點是否是最後一片葉子,然後將其刪除正確嗎? 沒有必要到達節點自己刪除它,直到父母會減少約一半的情況下? – Kraken