資料結構課的作業:實現二叉排序樹的建立,插入,刪除。
檢驗二叉排序樹正不正確,就需要中序輸出。如果是公升序就證明無錯。
對刪除操作有點暈就蒐集了一下
二叉排序樹的刪除:
假設被刪結點是*p,其雙親是*f,不失一般性,設*p是*f的左孩子,下面分三種情況討論:
⑴ 若結點*p是葉子結點,則只需修改其雙親結點*f的指標即可。
⑵ 若結點*p只有左子樹pl或者只有右子樹pr,則只要使pl或pr 成為其雙親結點的左子樹即可。
⑶ 若結點*p的左、右子樹均非空,先找到*p的中序前趨結點*s(注意*s是*p的左子樹中的最右下的結點,它的右鏈域為空),然後有兩種做法:
① 令*p的左子樹直接鏈到*p的雙親結點*f的左鏈上,而*p的右子樹鏈到*p的中序前趨結點*s的右鏈上。
② 以*p的中序前趨結點*s代替*p(即把*s的資料複製到*p中),將*s的左子樹鏈到*s的雙親結點*q的左(或右)鏈上。
**如下:
#include #includetypedef int elemtype;
#define inf -123456
struct bstree;
void inserbstree(bstree **bst,elemtype v)//插入值,用了二級指標
else if((*bst)->data>v)
inserbstree(&((*bst)->lchild),v);
else inserbstree(&((*bst)->rchild),v);
}bstree *createbstree()
return root;
}bstree *searchbstree(bstree *bst,elemtype v)//搜尋值,返回節點指標
void delbstree(bstree *root)
if(p==null)
if(p->lchild==null)
else
if(q==p)
q->lchild=s->lchild;
else q->rchild=s->lchild;
p->data=s->data;
free(s); }}
void middispprint(bstree *root)//中序輸出驗證
}int main()
二叉排序樹
在複習資料結構,把這個東西總結一下。這種結構是動態查詢表,這種動態是相對靜態查詢 順序查詢,折半查詢,分塊查詢等 來說的。對於各種靜態鍊錶,要達到查詢複雜度為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 ...