二叉排序樹

2021-07-10 09:53:25 字數 2613 閱讀 8097

二叉排序樹又稱二叉查詢樹,它是一種對排序和查詢都很有用的特殊二叉樹。

(1)若它的左子樹不為空,則左子樹上的所有結點的值均小於它的根結點的值;

(2)若它的右子樹不為空,則右子樹上所有結點的值均小於它的根結點上的值;

(3)它的左右子樹本身也分別為二叉排序樹。

通過中序排列我們發現中序遍歷的結果是結點的值是由低到高的。

typedef structelemtype;

typedef struct bstnode

bstnode,*bstreet;

二叉排序樹的 查詢依然沿用前面介紹的順序查詢和折半查詢。

(1)若二叉排序樹為空,則查詢失敗,則返回空指標。

(2)若二叉排序樹非空,將給定值key與根結點的關鍵字t->data.key進行比較:

若key等於t->data.key,則查詢成功,返回根結點位址;

若key小於t->data.key,則進一步查詢左子樹;

若key大於t->data.key,則進一步查詢右子樹。

演算法描述

bstree searchbst(bstree t,keytype key)

(1)若二叉排序樹為空,則待插入結點*s作為根結點插入到空樹中。

(2)若二叉排序樹非空,則將key與根結點的關鍵字t->data.key進行比較:

若key等於t->data.key,則停止插入;

若key小於t->data.key,則將*s插入左子樹;

若key大於t->data.key,,則將*s插入右子樹。

/*  當二叉排序樹t中不存在關鍵字等於key的資料元素時, */

/* 插入key並返回true,否則返回false */

status insertbst(bitree *t, int key)

else

return false; /* 樹中已有關鍵字相同的結點,不再插入 */

}

二叉排序樹的建立是從空的二叉排序樹開始,每輸入乙個結點,經過查詢操作,將新結點插入到當前二叉排序樹的合適位置。

(1)將二叉排序樹t初始化為空樹

(2)讀入乙個關鍵字為key的結點,將此結點插入二叉排序樹t中。

(3)重複操作,直至讀入的關鍵字key是輸入結束標誌。

注意:不同的的插入次序的序列生成不同形態的二叉排序樹

在二叉排序樹中刪除乙個結點,這是二叉排序樹中最有深度的操作。

主要分三種操作:

若*p結點為葉子結點,即pl(左子樹)和pr(右子樹)均為空樹。由於刪去葉子結點不破壞整棵樹的結構,則只需修改其雙親結點的指標即可。

若*p結點只有左子樹pl或右子樹pr,此時只要令pl或pr直接成為其雙親結點*f的左子樹(當*p是左子樹)或右子樹(當*p是右子樹)即可,作此修改也不破壞二叉排序樹的特性。

若*p結點的左子樹和右子樹均不空。在刪去*p之後,為保持其它元素之間的相對位置不變,可按中序遍歷保持有序進行調整。比較好的做法是,找到*p的直接前驅(或直接後繼)*s,用*s來替換結點*p,然後再刪除結點*s。

/* 若二叉排序樹t中存在關鍵字等於key的資料元素時,則刪除該資料元素結點, */

/* 並返回true;否則返回false。 */

status deletebst(bitree *t,int key)

}/* 從二叉排序樹中刪除結點p,並重接它的左或右子樹。 */

status delete(bitree *p)

else if((*p)->lchild==null) /* 只需重接它的右子樹 */

else /* 左右子樹均不空 */

(*p)->data=s->data; /* s指向被刪結點的直接前驅(將被刪結點前驅的值取代被刪結點的值) */

if(q!=*p)

q->rchild=s->lchild; /* 重接q的右子樹 */

else

q->lchild=s->lchild; /* 重接q的左子樹 */

free(s);

}return true;

}

二叉排序樹的查詢長度與二叉樹的形態有關,即

最好:log2n(形態均勻,與二分查詢的判定樹相似)

最壞:(n+1)/2(單支數)

所以為了改善查詢效率就引入我們接下來要學習的一種更優良的樹—-平衡二叉樹

二叉排序樹

在複習資料結構,把這個東西總結一下。這種結構是動態查詢表,這種動態是相對靜態查詢 順序查詢,折半查詢,分塊查詢等 來說的。對於各種靜態鍊錶,要達到查詢複雜度為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 ...