當二叉排序樹中不存在關鍵字等於 e.key 的資料元素時,插入元素值為 e 的結點,並返回 true;
否則,不進行插入並返回false
typedef struct bitreenode
bitreenode,
*bitree;
status insert bst(bitree &t, elemtype e)
else
return false;
}
(1)被刪除的結點是葉子結點,核心:其雙親結點中相應指標域的值改為「空」刪除節點20:
從根節點開始,查詢到20這個節點,讓他的雙親節點由f指標指向,釋放點20這個節點,同時修改30節點的左指標域為空。
(2)被刪除的結點只有左子樹或者只有右子樹,核心:其雙親結點的相應指標域的值改為 「指向被刪除結點的左子樹或右子樹」。
p指向待刪除節點,f指向雙親節點,
刪除掉40節點後,應該讓子樹重新連線到40節點的雙親節點30的右子樹域,這樣就完成了節點40的刪除
(3)被刪除的結點既有左子樹,也有右子樹:核心是:以其前驅替代之,然後再刪除該前驅結點
因為中序遍歷後會得到有序序列,50的前驅節點是40,讓前驅節點40去替換50,然後將前驅節點進行刪除,將其子樹
進行重連
具體演算法描述如下:
typedef struct bitreenode
bitreenode,
*bitree;
status deletebst(bitree &t, keytype key)
else
if(key
>data.key)
deletebst ( t-
>lchild, key );/
* 繼續在左子樹中進行查詢*
/else
deletebst ( t-
>rchild, key );/
*繼續在右子樹中進行查詢*/}
}/* deletebst*
/其中刪除操作過程如下所描述:
void dele(bitree &p)
else
if(!p-
>lchid)
/*只有右子樹*
/else
/*左右子樹均有*
/}
的描述如下:
左邊情況的**為:
q=p;
p=p-
>lchild;
f->lchild=p;
free(q)
;左邊情況的**為:
/* 左子樹為空樹只需重接它的右子樹*/的描述如下:
左邊情況的**為:
q=p;
p=p-
>rchild;
f->lchild=p;
free(q)
;左邊情況的**為:
/* 左右子樹均不空*/的描述如下:
q = p; s = p-
>lchild;
//待刪除節點的前驅節點的定位操作
while
(s->rchild)
p->data = s-
>data;
//讓前驅節點覆蓋當前被刪除節點
//重連操作
if(q != p )///
* 重接*q的左子樹*
/ q-
>rchild = s-
>lchild;
else
q->lchild = s-
>lchild;
free(s)
;//s的內容已複製到p上,即p實際上已變成s*
/
//待刪除節點的前驅節點的定位操作的解釋如下:
p節點是待刪除節點,讓s節點指向其左孩子,讓while迴圈不停的找右孩子,直到找到s節點,其雙親節點用q指向,
經過若干步之後,s節點就沒有右子樹了,若他還有右子樹的話,他就不會是p節點的前驅節點(按照中序遍歷的思想去想)
//重連操作的解釋如下:
按照上述的解釋q!=p,所以可以直接進行重連操作;
若只有左子樹,不存在右子樹的話,s位置只能是如下圖所示的位置,此時p和q同時指向被刪除節點
二叉樹,完全二叉樹,滿二叉樹,二叉排序樹
二叉樹 二叉樹是每個節點最多有兩個子樹的樹結構 是n n 0 個結點的有限集合,它或者是空樹 n 0 或者是由乙個根結點及兩顆互不相交的 分別稱為左子樹和右子樹的二叉樹所組成。完全二叉樹 除最後一層外,每一層上的結點數均達到最大值 在最後一層上只缺少右邊的若干結點 樹中所含的n個節點和滿二叉樹中編號...
樹與二叉樹的應用 二叉排序樹
1 二叉排序樹的定義 二叉排序樹 簡稱 bst 也稱為 二叉查詢樹 二叉查詢樹或者是一棵空樹,或者是一棵具有下列 特性的非空二叉樹 a.若左子樹非空,則左子樹上所有結點關鍵字值均小於根結點的關鍵字值 b.若右子樹非空,則右子樹上所有結點關鍵子值均大於根結點的關鍵字值 c.左 右子樹本身也分別是一棵二...
二叉樹(四) 二叉排序樹
二叉排序樹或者非空二叉樹,或者為具有以下性質的二叉樹 1 若根結點的左子樹不空,則左子樹上所有結點的值都小於根結點的值 2 若根結點的右子樹不空,則右子樹上所有結點的值都大於或者等於根結點的值 每一棵子樹分別也是二叉排序樹。上述定義為遞迴定義 如下圖 該二叉樹的中序序列如下 10,30,35,38,...