二叉查詢樹的刪除操作
阿新 • • 發佈:2018-12-24
對於二叉樹的刪除操作來說,存在三種情況
**1.**當刪除節點為葉節點的時候,此時將節點置為空
**2.**當刪除節點為根節點且該根節點只有一個子樹的時候,此時需要替換掉刪除元素,最後再進行釋放
**3.**當刪除節點為根節點且根節點存在兩個子樹的時候,此時我們可以選擇替換左子樹的最大元素,或者右子樹的最小元素
C程式碼如下
Tree de_tree(Item data, Tree t) //二叉樹元素的刪除
{
Tree parent; //根節點
Tree curTree; //現在的節點
Tree fTree = t; //找到的節點位置
while (fTree)
{
if (data == fTree->element) //找到元素則退出
break;
else if (data < fTree->element) //如果元素小於當前元素 則向左查詢
{
parent = fTree;
fTree = fTree->lchild;
}
else
{ //否則向右查詢
parent = fTree;
fTree = fTree->rchild;
}
}
if (!fTree) //如果沒有找到要刪除的元素的話 直接返回t
return t;
///刪除的第一種情況 當找到的元素為葉節點的時候
if (!fTree->lchild && !fTree->rchild)
{
if (fTree == t) //表示該樹只有一個根節點
{
t = NULL; //將根節點置為NULL
free(fTree);
}
else if (fTree == parent->lchild) //該葉節點為左子樹
{
parent->lchild = NULL; //左子樹置為NULL
free(fTree);
}
else
{ //該葉節點為左子樹
parent->rchild = NULL; //右子樹置為NULL
free(fTree);
}
return t;
}
///刪除的第二種情況 左子樹或右子樹為空
else if (!fTree->lchild || !fTree->rchild)
{
if (fTree == parent->lchild) //如果當前要刪除的節點是父節點的左子樹的時候
{
if (fTree->lchild) //刪除的節點只有一個左子樹
parent->lchild = fTree->lchild; //那麼跳過要刪除的節點並替換為下個左子樹
else //刪除的節點只有一個右子樹
parent->lchild = fTree->rchild; //替換為下個右子樹
}
else
{ //如果當前要刪除的節點是父節點的右子樹的時候
if (fTree->lchild) //只有一個左子樹
parent->rchild = fTree->lchild;
else //只有一個右子樹
parent->rchild = fTree->rchild;
}
free(fTree);
return t;
}
///刪除的第三種情況 也就是當左子樹和右子樹都不為空的情況下進行刪除
///此時可以選擇將刪除元素替換為左子樹的最大值和右子樹的最小值
else
{
parent = fTree;
curTree = fTree->lchild; //此處我們選擇左子樹的最大值
while (curTree->rchild) //找到最右下角的位置,也就是左子樹中的最大值
{
parent = curTree; //每次向下尋找
curTree = curTree->rchild;
}
fTree->element = curTree->element; //交換最大值
if (parent == fTree) //表示左子樹的最大值為要刪除元素的左子樹
parent->lchild = curTree->lchild; //跳過該元素
else
parent->rchild = curTree->lchild; //因為已經交換了最大值,那麼我們就需要跳過該節點
free(curTree);
return t;
}
}
程式碼已經很詳細的解釋瞭如何進行操作的,祝大家學習順利!