#include <stdio.h>
typedef struct _Node
{
int value;
_Node* parent;
_Node* left;
_Node* right;
}Node;
Node* root;
void BSTree_destroy(Node* node)
{
if (node == NULL)
return;
BSTree_destroy(node->left);
BSTree_destroy(node->right);
delete node;
}
void BSTree_init()
{
BSTree_destroy(root);
}
Node* BSTree_search(int value)
{
Node* node = root;
while (node)
{
if (node->value < value)
node = node->right;
else if (node->value > value)
node = node->left;
else
return node;
}
return NULL;
}
void BSTree_insert(int value)
{
Node* parent = NULL;
Node* node = root;
while (node)
{
parent = node;
if (node->value < value)
node = node->right;
else if (node->value > value)
node = node->left;
else
return;
}
Node* new_node = new Node;
new_node->value = value;
new_node->parent = NULL;
new_node->left = new_node->right = NULL;
if (!parent)
root = new_node;
else
{
if (parent->value < value)
parent->right = new_node;
else
parent->left = new_node;
}
new_node->parent = parent;
}
void BSTree_delete(Node* node)
{
Node* parent = node->parent;
if (!node->left && !node->right)//node為葉子結(jié)點
{
if (!parent)
root = NULL;
else
{
if (parent->left == node)
parent->left = NULL;
else
parent->right = NULL;
}
delete node;
}
else if (node->left && node->right)//node結(jié)點左右子樹均不為空
{
Node* pre_node= node->left;
while (pre_node->right)
{
pre_node = pre_node->right;
}
node->value = pre_node->value; //找到直接前驅(qū),替換當(dāng)前節(jié)點
if (pre_node->parent == node) //未執(zhí)行上述while循環(huán),重接左子樹
pre_node->parent->left = pre_node->left;
else //執(zhí)行上述while循環(huán),重接右子樹
pre_node->parent->right = pre_node->left;
if (pre_node->left)
pre_node->left->parent = pre_node->parent;
delete pre_node;
}
else//node結(jié)點的左子樹為空或者右子樹為空
{
Node* child = node->left ? node->left : node->right;
if (!parent)
{
root = child;
child->parent = root;
}
else
{
child->parent = parent;
if (parent->left == node)
parent->left = child;
else
parent->right = child;
}
delete node;
}
}
int main(void)
{
BSTree_init();
BSTree_insert(8);
BSTree_insert(3);
BSTree_insert(10);
BSTree_insert(1);
BSTree_insert(6);
BSTree_insert(14);
BSTree_insert(4);
BSTree_insert(7);
BSTree_insert(13);
Node* node = BSTree_search(100);
if (!node || node->value != 100)
printf("search error!\n");
node = BSTree_search(10);
if (!node || node->value != 10)
printf("search error!\n");
else
BSTree_delete(node);
node = BSTree_search(3);
if (!node || node->value != 3)
printf("search error!\n");
else
BSTree_delete(node);
node = BSTree_search(8);
if (!node || node->value != 8)
printf("search error!\n");
else
BSTree_delete(node);
return 0;
}
二叉排序樹
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 參考資料:[1]http://www.cnblogs.com/skywang12345/p/3576373.htm...
- 一.課程設(shè)計題目及要求 (一)課程設(shè)計題目 用順序和二叉鏈表作存儲結(jié)構(gòu)實現(xiàn)二叉排序樹: (1)以回車('\n')為...
- 判斷是否是二叉排序樹:下面采用采用兩種方法,1.遞歸的進行判斷。2.用中序遍歷判斷。后更:第一種方法實際上是錯誤的...
- 1 前言 數(shù)據(jù)結(jié)構(gòu)中,線性表分為無序線性表和有序線性表。無序線性表的數(shù)據(jù)是雜亂無序的,所以在插入和刪除時,沒有什么...
- 插入和刪除 ----- 查找 是一對矛盾體。 對于無序數(shù)據(jù)結(jié)構(gòu),插入和刪除的效率高,查找的效率可能就低。為了平衡插...