二叉排序樹

2022-04-19 07:09:15 字數 1988 閱讀 4726

二叉排序樹,也稱作二叉查詢樹,一般定義為或者是空樹,或者是滿足以下條件的二叉樹:

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

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

(3)  它的左、右子樹本身也是二叉排序樹。

#includetypedef 

int keytype; //

資料域值型別

typedef struct

node

bitree; //

二叉排序樹結點資料型別

!-----------二叉排序樹的查詢

1.遞迴查詢演算法

bitree *f = null;       //

存放雙親結點指標,插入和刪除時使用

bitree *find(bitree *t,keytype x)

}

2.非遞迴查詢演算法

bitree *f = null;       //

存放雙親結點指標,插入和刪除時使用

bitree *searchbst(bitree *t,keytype key)

else

if(keydata)

else

return

c;}

!-------------二叉排序樹的插入

向二叉樹中插入乙個新元素的演算法思路:

(1)在插入之前,先使用查詢演算法在樹中檢查要插入的元素是否存在。

(2)搜尋成功:樹中已有這個元素,不再插入,可能會做刪除操作。

(3)搜尋失敗:樹中沒有關鍵字值等於給定值的結點,將新元素接入到查詢停止處。

bitree *insertbst(bitree *t,keytype key)

return

t;}

!---------二叉排序樹的建立

bitree *creatbst()

return

t;}

!-------二叉排序樹的刪除

(1)刪除葉子結點,只需將其雙親結點中指向它的指標置空,再釋放它即可。

(2)被刪結點無右子樹,可以用它的左孩子結點頂替它的位置,再釋放它。

(3)被刪結點無左子樹,可以用它的右孩子結點頂替它的位置,再釋放它。

(4)被刪結點同時有左子樹和右子樹,用左子樹的最右下結點替換被刪結點。

int deletebst(bitree *t,keytype key)

if(p->left==null) //

左子樹空,則重接其右子樹

else

if(p->right==null) //

右子樹為空,則重接其左子樹

else

//左右子樹都不空

//找到p的左子樹的最右下結點s

if(q!=p) q->right=s->left; //

重接q的右子樹

else q->left = s->left; //

重接q的左子樹

q=s;p->data = s->data; //

用s結點的值替換p結點的值

}

if(f==null) t=p; //

若被刪除結點為根節點,則將p改為根結點

else

if(q!=s) //

左子樹為空或右子樹為空的結點p與其雙親結點重新鏈結

if(keydata) f->left =p;

else f->right=p;

free

(q);

return1;

}

二叉排序樹

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