二叉排序樹

2021-07-16 05:45:46 字數 1851 閱讀 3623

二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹:

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

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

(3)左、右子樹也分別為二叉排序樹;

(4)沒有鍵值相等的結點。

二叉排序樹的查詢演算法:

/* 遞迴查詢二叉排序樹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; /* 樹中已有關鍵字相同的結點,不再插入 */

}二叉排序樹的刪除演算法:

在二叉排序樹中刪去乙個結點,分三種情況討論:

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

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

3.若*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;

}最好的情況是二叉排序樹的形態和折半查詢的判定樹相同,其平均查詢長度和logn成正比(o(log2(n)))。最壞情況下,當先後插入的關鍵字有序時,構成的二叉排序樹為一棵斜樹,樹的深度為n,其平均查詢長度為(n + 1) / 2。也就是時間複雜度為o(n),等同於順序查詢。因此,如果希望對乙個集合按二叉排序樹查詢,最好是把它構建成一棵平衡的二叉排序樹(平衡二叉樹)。

二叉排序樹

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