BST 二叉搜索树实现

1. BST.h

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

typedef int K;

typedef struct tree_node {
	K key;
	struct tree_node* left;
	struct tree_node* right;
} TreeNode;

typedef struct {
	TreeNode* root;
} BST;

void bst_insert(BST* tree, int key);
TreeNode* bst_search(BST* tree, int key);
void bst_delete(BST* tree, int key);

2. BST.c

#include"BST.h"

void bst_insert(BST* tree, int key) {
	TreeNode* newNode = calloc(1, sizeof(TreeNode));
	newNode->key = key;
	TreeNode* parent = NULL;
	TreeNode* curr = tree->root;
	int cmp;
	while (curr) {
		cmp = key - curr->key;
		if(cmp > 0){
			parent = curr;
			curr = curr->right;
		}else if (cmp < 0) {
			parent = curr;
			curr = curr->left;
		}else {
			//已有key值结点
			return;
		}
	}//curr == NULL
	if (!parent) {
		//说明插入的是根节点
		tree->root = newNode;
	} else if (cmp > 0) {
		parent->right = newNode;
	} else {
		parent->left = newNode;
	}
}

TreeNode* bst_search(BST* tree, int key) {
	TreeNode* curr = tree->root;
	int cmp;
	while (curr) {
		cmp = key - curr->key;
		if (cmp > 0) {
			curr = curr->right;
		}
		else if (cmp < 0) {
			curr = curr->left;
		}
		else {
			//找到key值结点
			return curr;
		}
	}//curr == NULL
	return NULL;
}

void bst_delete(BST* tree, int key) {
	//遍历二叉树,找到要删除的结点
	TreeNode* parent = NULL;
	TreeNode* curr = tree->root;
	int cmp;
	while (curr) {
		cmp = key - curr->key;
		if (cmp > 0) {
			parent = curr;
			curr = curr->right;
		}
		else if (cmp < 0) {
			parent = curr;
			curr = curr->left;
		}
		else {
			//cmp = 0找到key结点
			break;
		}
	}//curr == NULL || curr != NULL
	if (curr == NULL) return;
	
	//先将度为2的情况退化处理
	if (curr->left && curr->right) {
		//找右子树中最小的结点
		TreeNode* minOfParent = curr;
		TreeNode* minOfRight = curr->right;
		while (minOfRight->left){
			minOfParent = minOfRight;
			minOfRight = minOfRight->left;
		}//minOfRight->left == NULL
		//minOfRight即为curr右子树中最小的结点
		curr->key = minOfRight->key;
		curr = minOfRight;
		parent = minOfParent;
	}
	//现在转化为度为0或1的情况,
	//curr指向待操作的结点
	TreeNode* child = curr->left ? curr->left : curr->right;
	if (curr->key < parent->key) {
		//说明删的是parent的左结点
		parent->left = child;
	} else {
		parent->right = child;
	}
}

3. main.c

#include"BST.h"

int main(void) {
	BST* newBst = calloc(1, sizeof(BST));
	bst_insert(newBst, 9);
	bst_insert(newBst, 5);
	bst_insert(newBst, 42);
	bst_insert(newBst, 3);
	bst_insert(newBst, 13);
	bst_insert(newBst, 57);

	bst_delete(newBst, 9);

	return 0;

}

4. 测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值