[數(shù)據(jù)結構4.7]二叉排序樹

二叉排序樹(BST),也稱二叉查找樹。


二叉排序樹或者為空樹,或者為非空樹,當為非空樹時有如下特點:

1、若左子樹非空,則右子樹所有的結點關鍵字值均小于根節(jié)點的關鍵字。

2、若右子樹非空,則右子樹所有的結點關鍵字值均大于根節(jié)點的關鍵字。

3、左、右子樹本身也分別是一課二叉排序樹。


* 二叉排序樹的中序遍歷序列是一個遞增的有序序列。




查找

二叉樹非空時,查找根結點,若相等則查找成功;

若不等,則當小于根節(jié)點值時,查找左子樹;當大于根節(jié)點值時,查找右子樹。

當查找到葉子結點仍沒查找到相應的值,則查找失敗。

BSTNode *BST_Search(BiTree T,ElemType key,BSTNode *&p){

? ? ? ? p=null;

? ? ? ? while(T!=null&key!=T->data){

? ? ? ? ? ? ? ? p=T;

????????????????if(key>T->data)

? ? ? ? ? ? ? ? ? ? ? ? T = T->rchild;

? ? ? ? ? ? ? ? else

? ???????????????????????T = T->lchild;

????????}

? ? ? ? return T;

}




插入

如二叉排序樹為空,直接插入結點;

若二叉排序樹非空,當值小于根結點的時,插入左子樹;當值大于根結點時,插入右子樹;當值等于根結點時不進行插入。

int BST_Insert(BiTree &T,KeyType k){

? ? ? ? if(T==NULL)

? ? ? ? ? ? ? ? T = (BiTree)malloc(sizeof(BSTNode));

? ? ? ? ? ? ? ? T->date = k;

? ? ? ? ? ? ? ? T->lchild = T->rchild = null;

? ? ? ? ? ? ? ? return 1;

? ? ? ? else if(T->data==k)

? ? ? ? ? ? ? ? return 0;

? ? ? ? else if(?k >?T->data )

? ? ? ? ? ? ? ? return BST_Insert(T->rchild,k);

? ? ? ? else

? ? ? ? ? ? ? ? return BST_Insert(T->lchild,k);? ? ?

}




構造二叉排序樹

讀入一個元素并建立結點,若二叉樹為空,將其作為根結點;

若二叉樹排序樹非空,當值小于根結點時,插入左子樹;當值小于根結點時,插入右子樹;當值等于根結點時,不進行插入。

void Create_BST(BiTree &T,KeyType str[],int n){

? ? ? ? T=NULL;

? ? ? ? int i = 0;

? ? ? ? while(i<n){

? ? ? ? ? ? ? ? BST_Insert(T,str[i]);

? ? ? ? ? ? ? ? i++;

????????}

}????????

注:二叉排序樹的構建情況會因為str數(shù)組中數(shù)字排序的順序不一樣,而產(chǎn)生不一樣的效果。




刪除

1、若被刪除的結點是葉子結點,則直接刪除;

2、若被刪除結點z只有一棵子樹,則讓z的子樹成為z父結點的子樹,代替z結點;

3、若被刪除的結點z有兩棵子樹,則讓z的中序序列直接后繼代替z,并刪去直接后繼結點。


在二叉排序樹中刪除并插入某結點(結點值相同),得到的二叉排序樹是否與原來一致?

結論:可能相同,也可能不同。




查找效率

平均查找長度(ASL)取決于樹的高度。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容