二叉排序樹,也稱作二叉查詢樹,一般定義為或者是空樹,或者是滿足以下條件的二叉樹:
(1)若它的左子樹不空,則左子樹上所有記錄的關鍵字值均小於根記錄關鍵字的值。
(2)若它的右子樹不空,則右子樹上所有記錄的關鍵字均大於根記錄關鍵字的值。
(3) 它的左、右子樹本身也是二叉排序樹。
#includetypedefint 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 ...