1. 程式人生 > >二叉查詢樹的刪除操作

二叉查詢樹的刪除操作

對於二叉樹的刪除操作來說,存在三種情況
**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; } }

程式碼已經很詳細的解釋瞭如何進行操作的,祝大家學習順利!