二叉排序樹的建立 查詢和刪除

2021-07-10 10:50:15 字數 1692 閱讀 8294

二叉排序樹是一種動態樹表.

二叉排序樹的定義:二叉排序樹或者是一顆空樹,或者是一顆具有如下性質的二叉樹:

在二叉排序樹中插入新的節點,要保證插入後的二叉樹仍然符合二叉樹的定義.

插入過程:若二叉排序樹為空, 則待插入的節點*s作為根節點插入到空樹中;

當非空時,將待插入點關鍵字k 和根節點bst->key;若kkey.bst=bst-bst->key,bst=bst->rchild,一直這樣遞迴下去,知道bst為空,插入到葉子節點.若k=bst->key,則不做任何操作, 直接返回.

3.二叉樹排序樹的生成:

從空的二叉排序樹開始, 經過一系列的查詢插入操作之後,生成了一顆二叉排序樹.

說明:每次插入的都是二叉樹的葉子節點.

由不同順序的關鍵字序列,會得到不同的二叉排序樹.

對於乙個任意的關鍵字序列構造一顆二叉樹,其實是對關鍵字進行排序.

假設被刪節點*p的雙親節點是*f:

1.若*p是葉子節點,則只需要修改雙親節點的指標.

2.若節點*p是*f的左孩子.且*p只有左孩子或者只有右孩子,則只要使*p的左孩子或右孩子成為f的左孩子.     若節點*p是*f的右孩子孩子.且*p只有左孩子或者只有右孩子,則只要使*p的左孩子或右孩子成為f的右孩子.

3.若節點的左右子樹均非空,先找到*p的前驅節點*s(注意*s是*p的左子樹中最右下的節點,它的右鏈為空),以*p的中序前趨結點*s代替*p(即把*s的資料複製到*p中),將*s的左子樹鏈到*s的雙親結點*q的左(或右)鏈上.

下面是我實現的**:

#include#include#define infine 32678

typedef int keytype; //資料型別

typedef struct node

bstnode,*bstree;

void insertbst(bstree *bst,keytype k) //插入建樹法;

elseelse if(k<(*bst)->key)

}}void created(bstree *bst)

}void inorder(bstree bst)

}bstree serchbst(bstree bst,keytype k)

if(k>q->key)else

}return null;

}bstree deletebst(bstree bst,keytype k)

f=p; //f記錄p的雙親節點.

if(p->key > k)else

}if(p==null)

if(p->lchild==null && p->rchild==null)elseelse

}free(p);

}else if(p->lchild == null && p->rchild != null)else

free(p);

}else if(p->rchild == null && p->lchild != null)else

free(p);

}else if(p->lchild!=null && p->rchild!=null)

if(q!=p)else

p->key=s->key; //以p的(中序)前驅節點s的key替換p中值.

free(s);

}}int main(int argc,char *argv)

二叉排序樹的刪除和查詢

二叉排序樹的刪除和查詢可以用遞迴實現,也可以用迴圈實現。1.查詢 1.1查詢值 bool search tnode root,int value root false while root data value 1.2 查詢中序遍歷的字首或者字尾 node search node tnode roo...

二叉排序樹的建立,刪除

最近在複習資料結構,對於二叉排序樹,看了一些書,參考別人的思想寫出了這個 希望看到的人給點修改建議 如下 include include typedef struct bitree bitree typedef struct bitree ibitree ibitree q int searchtr...

二叉查詢樹(二叉排序樹)建立,插入,刪除操作。

尋找節點就是直接依據數值的大小。從root節點開始遍歷,大於當前遍歷節點就向它的右子樹查詢,相反則查詢它的左子樹。然後返回。直接依據root節點,遍歷到最右就是最大節點,遍歷到最左,就是最小節點。插入節點我這裡插入的節點都會成為葉子節點。依據大小的關係向下遍歷,遍歷到最後的節點,然後插入就能夠了。這...