二叉搜素樹 c 語言實現

來源:互聯網
上載者:User

一、介紹

二叉搜尋樹(Binary Search Tree),或者是一棵空樹,或者是具有下列性質的二叉樹:

1,若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
2,若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
3,它的左、右子樹也分別為二叉搜尋樹。

二叉搜尋樹的尋找過程和次優二叉樹類似,通常採取二叉鏈表作為二叉搜尋序樹的儲存結構。中序遍曆二叉搜尋樹可得到一個關鍵字的有序序列,

一個無序序列可以通過構造一棵二叉搜尋樹變成一個有序序列,構造樹的過程即為對無序序列進行排序的過程。每次插入的新的結點都是二叉搜尋

樹上新的葉子結點,在進行插入操作時,不必移動其它結點,只需改動某個結點的指標,由空變為非空即可。搜尋,插入,刪除的複雜度等於樹高,

O(log(n)) .

基本結構為:

typedef int type;typedef struct node{type value;struct node *left;struct node *right;}Search_tree;

二、基本操作

建立和刪除二叉搜素樹:

Search_tree *search_tree_create(type value)//建立{Search_tree *p = (Search_tree*)malloc(sizeof(Search_tree));if(NULL == p)return NULL;p->value = value;p->left = p->right = NULL; return p;}void search_tree_destroy(Search_tree *t)//刪除(釋放){if(t){if(t->left)search_tree_destroy(t->left);if(t->right)search_tree_destroy(t->right);free(t);t = NULL;}}

尋找
在二叉搜尋樹t中尋找value的過程為:
1,若t是空樹,則搜尋失敗,否則:
2,若value等於t的根結點的資料域之值,則尋找成功;否則:
3,若value小於t的根結點的資料域之值,則搜尋左子樹;否則:
4,尋找右子樹。

Search_tree * search_tree_by_value(Search_tree *t, type value){if(t == NULL)return NULL;if(t->value == value)return t;else if(t->value > value) return search_tree_by_value(t->left, value);elsereturn search_tree_by_value(t->right, value);}

插入
向一個二叉搜尋樹t中插入一個結點s的演算法,過程為:
1,若t是空樹,則將建立結點作為根結點插入,否則:
2,若value小於t 的根結點的資料域之值,則把value插入到左子樹中,否則:
3,把value插入到右子樹中。否則(包括已存在value值的節點) 返回。

Search_tree *search_tree_insert(Search_tree *t, type value){if(t == NULL)// no roott = search_tree_create(value);else if(t->value > value)t->left = search_tree_insert(t->left, value);else if(t->value < value)t->right = search_tree_insert(t->right, value);return t;}

刪除
在二叉搜尋樹刪去一個結點,分三種情況討論:
1,若*p結點為葉子結點,即PL(左子樹)和PR(右子樹)均為空白樹。由於刪去葉子結點不破壞整棵樹的結構,則只需修改其雙親結點的指標為空白即可。
2,若*p結點只有左子樹PL或右子樹PR,此時只要令PL或PR直接成為其雙親結點*f的左子樹(或者右子樹)即可,作此修改也不破壞二叉搜尋樹的特性。
3,若*p結點的左子樹和右子樹均不空。在刪去*p之後,為保持其它元素之間的相對位置不變,可按中序遍曆保持有序進行調整,我們的做法是搜尋節點p右子樹上值最小的節點min並用min的值代替p的值,最後利用方法2把節點p的右子樹的min節點刪除即可(可以畫圖看下,和實際情況符合)。
在二叉搜尋樹上刪除一個結點的演算法如下:

Search_tree *search_tree_delete(Search_tree *t, type value){if(t == NULL)return NULL;Search_tree *p = search_tree_by_value(t, value);if(p == NULL){printf("no value %d\n", value);return NULL;}if(p->left && p->right)// left right  are all exist{Search_tree *min = search_tree_min(p->right);p->value = min->value;p->right = search_tree_delete(p->right, min->value);}else{Search_tree *temp = p;if(p->left) // 左子樹非空p = p->left;else p = p->right;free(temp);temp = NULL;}return p;}

完整代碼如下:

#include <stdio.h>#include <stdlib.h>typedef int type;typedef struct node{type value;struct node *left;struct node *right;}Search_tree;Search_tree *search_tree_create(type value){Search_tree *p = (Search_tree*)malloc(sizeof(Search_tree));if(NULL == p)return NULL;p->value = value;p->left = p->right = NULL; return p;}void search_tree_destroy(Search_tree *t){if(t){if(t->left)search_tree_destroy(t->left);if(t->right)search_tree_destroy(t->right);free(t);t = NULL;}}Search_tree * search_tree_by_value(Search_tree *t, type value){if(t == NULL)return NULL;if(t->value == value)return t;else if(t->value > value) return search_tree_by_value(t->left, value);elsereturn search_tree_by_value(t->right, value);}Search_tree *search_tree_min(Search_tree *t){if(NULL == t)return NULL;Search_tree *p = t;while(p->left)p = p->left;return p;}Search_tree *search_tree_max(Search_tree *t){if(NULL == t)return NULL;Search_tree *p = t;while(p->right)p = p->right;return p;}Search_tree *search_tree_insert(Search_tree *t, type value){if(t == NULL)// no roott = search_tree_create(value);else if(t->value > value)t->left = search_tree_insert(t->left, value);else if(t->value < value)t->right = search_tree_insert(t->right, value);return t;}Search_tree *search_tree_delete(Search_tree *t, type value){if(t == NULL)return NULL;Search_tree *p = search_tree_by_value(t, value);if(p == NULL){printf("no value %d\n", value);return NULL;}if(p->left && p->right)// left right  are all exist{Search_tree *min = search_tree_min(p->right);p->value = min->value;p->right = search_tree_delete(p->right, min->value);}else{Search_tree *temp = p;if(p->left) // 左子樹非空p = p->left;else p = p->right;free(temp);temp = NULL;}return p;}void search_tree_order(Search_tree *t)//中序輸出{if(t == NULL)return ;search_tree_order(t->left);printf("%d ", t->value);search_tree_order(t->right);}int main(){Search_tree *root = search_tree_create(11);search_tree_insert(root, 8);search_tree_insert(root, 15);search_tree_insert(root, 4);search_tree_insert(root, 9);search_tree_insert(root, 15);search_tree_insert(root, 18);search_tree_order(root);search_tree_delete(root, 8);printf("\n");search_tree_order(root);search_tree_destroy(root);return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.