二叉排序樹

2021-09-24 07:35:23 字數 2066 閱讀 7273

二叉排序樹(binary sort tree),又稱二叉查詢樹。它或者是一顆空樹,或者是具有下列性質的二叉樹:

1.若它的左子樹不空,則左子樹上所有結點的值均小於它的根結構的值

2.若它的右子樹不空,則右子樹上所有結點的值均大於它的根結構的值

3.它的左、右子樹也分別為二叉排序樹

二叉排序樹的結點間滿足一定的次序關係,左子樹結點一定比其雙親結點小,右子樹結點一定比其雙親結點大。

首先二叉樹的結構如下:

typedef struct bitnode  //結點結構

bitnode, *bitree;

查詢操作如下:

/* 遞迴查詢二叉排序樹t中是否存在key,

指標f指向t的雙親,其初始呼叫值為null.

若查詢成功,則指標p指向該資料元素結點,並返回true;

否則指標p指向查詢路徑上訪問的最後乙個結點並返回false

*/status searchbst(bitree t, int key, bitree f, bitree *p)

else if(key == t->data) //查詢成功

else if(keydata)

return searchbst(t->lchild, key, t, p) //在左子樹繼續查詢,遞迴呼叫

else

return searchbst(t->rchild, key, t, p) //在右子樹繼續查詢,遞迴呼叫

}

二叉排序樹的插入,其實就是將關鍵字放到樹中的合適位置。**如下:

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

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

*/status insertbst(bitree *t, int key)

else

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

}

有了二叉排序樹的插入**就可以構建二叉排序樹了。

int i;

int a[10] =

bitree = null;

for(i=0;i<10;i++)

刪除結點存在三種情況:

1.葉子結點;

2.僅有左或者右子樹的結點;

3.左右子樹都有結點

下面看具體**:

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

然後返回true,否則返回false

*/status deletebst(bitree *t, int key)

}

這段**和前面的二叉排序樹查詢幾乎完全相同,區別在於此處使用的是delete方法。deletebst()函式具體方法如下:

/* 從二叉排序樹中刪除結點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->rchild; //重接q的左子樹

free(s);

}return true;

}

上面的**是刪除結點的前驅結點替換的方法,對於後繼結點的替換是一樣的。

二叉排序樹是以鏈結的方式儲存,保持了鏈式結構在執行插入、刪除操作時不用移動資料的優點。但二叉排序樹的查詢效能取決於二叉排序樹的形狀。問題在於,二叉排序樹的形狀是不確定的。因此如何是二叉排序樹平衡是乙個問題。

二叉排序樹

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