二叉排序樹

2021-06-27 05:01:53 字數 1179 閱讀 8113

資料結構課的作業:實現二叉排序樹的建立,插入,刪除。

檢驗二叉排序樹正不正確,就需要中序輸出。如果是公升序就證明無錯。

對刪除操作有點暈就蒐集了一下

二叉排序樹的刪除:

假設被刪結點是*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 ...