一 概念
二叉排序樹或者是空樹,或者是滿足如下性質的二叉樹:
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 ...