二叉排序樹

2021-06-21 22:04:11 字數 1457 閱讀 2444

一 概念

二叉排序樹或者是空樹,或者是滿足如下性質的二叉樹:

1.若它的左子樹不空,則左子樹上所有的關鍵字的值均小於根關鍵字的值。

2.若它的右子樹不空,則右子樹上所有關鍵字的值均大於根關鍵字的值。

3.左右子樹又是一棵二叉排序樹

二 bst的演算法

1.查詢關鍵字的演算法

由bst的定義可知,根結點中的關鍵字將所有的關鍵字分成了兩部分,即大於根節點中關鍵字的部分和小於根節點關鍵字的部分。可以將待查關鍵字先和根節點中關鍵字比較,如果相等則查詢成功;如果相等則查詢成功;如果小於則到左子樹中去查詢,如果大於則到右子樹中查詢。來到當前樹的子樹根中,重複上述過程。如果來到了結點的空指標與,則說明查詢失敗,實際上折半查詢的判定樹就是乙個二叉排序樹。

btnode * bstsearch(btnode * bt,int key) 

}

2.插入關鍵字演算法

二叉排序樹是乙個查詢表,插入乙個關鍵字時首先要找到插入位置。對乙個不存在於二叉排序數中的關鍵字,其查詢不成功的位置即為該關鍵字的插入位置。因此只需對查詢關鍵字的演算法進行修改,在來到空指標的時候將關鍵字插入。

btnode * insert(btnode * root,datatype w)

else if ( root->weight==w )

return root;

else if (root !=null && w>root->weight)

else

}

3.二叉排序樹的構造

二叉排序樹的構造就變得非常簡單,只需要建立一棵空樹,然後將關鍵字逐個插入到空樹中即可。

4.二叉排序樹的刪除

二叉排序樹的刪除分為三種情況

假設要刪除的結點為*q,其雙親結點為*f,可設*p是*f的左孩子,分三種情況進行討論

1)若*p結點為葉子結點,直接刪除即可

2)*p只有右子樹而無左子樹,或者只有左子樹而無右子樹。此時只需將p刪掉,然後將p的子樹直接連線在原來p與其雙親結點f相連的指標上即可。

3)*p結點既有左子樹又有右子樹。將*p的直接前驅代替*p,然後刪除p的直接前驅。但是要注意,刪除p的直接前驅時,不要忘記把p的之間前驅s的左子樹接到s的父節點的右子樹上。

int  del (btnode * & p)//刪除結點指標為p的結點

else if(!p->rchild)//右子樹空

else//左右為空,用中序遍歷的p結點的前驅直接覆蓋p的值,然後重接s的左右子樹

p->weight=s->weight;

if(q!=p) q->rchild=s->lchild;

else

q->lchild=s->lchild;//說明p的左子樹的右子樹空

free(s);

} return ok;

}

}

二叉排序樹

在複習資料結構,把這個東西總結一下。這種結構是動態查詢表,這種動態是相對靜態查詢 順序查詢,折半查詢,分塊查詢等 來說的。對於各種靜態鍊錶,要達到查詢複雜度為o logn 必須要求有序 而要使插入刪除複雜度為o 1 必須是鍊錶儲存。動態查詢表就可以同時滿足這兩者。動態查詢表的特點是表結構本身在查詢過...

二叉排序樹

name 二叉排序樹相關操作 author unimen date 2011 10 8 13 14 21 刪除結點比較麻煩,總結如下 4大種情況 1 結點p無右孩子 將該點的左孩子變為其在雙親中的同位孩子 1 p為其雙親的左孩子時將其的左孩子變為雙親的左孩子 2 p為其雙親的右孩子時將其的左孩子變為...

二叉排序樹

include include include include struct tree node void insert node struct tree node int void pre order struct tree node void in order struct tree node ...