0
点赞
收藏
分享

微信扫一扫

二叉搜索树代码实现

NicoalsNC 2022-02-06 阅读 18
数据结构
//令人头大的   ·二叉搜索树·
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct Node {
	int val,size;//size代表当前节点下面有几个节点
	struct Node* left, * right;
}Node;
 //开课吧平衡二叉树上有具体讲解NIL
Node __NIL;
#define NIL (&__NIL)

#define INITIALIZER(f) \
   static void init_NIL(void) __attribute__((constructor));\;
void init_NIL() {
	NIL->val = 0;
	NIL->size = 0;
	NIL->left =NIL->right = NIL;
}
//这个函数看不懂
void update_size(Node* root) {
	root->size = root->left->size + root->right->size + 1;
	return;
}
Node* get_newNode(int key) {
	Node* p = (Node*)malloc(sizeof(Node));
	p->left = p->right = NIL;
	p->val = key;
	p->size = 0;
	return p;
}
Node* insert(Node* root, int target) {
	if (root == NIL)return get_newNode(target);
	if (root->val == target)return root;
	if (root->val > target)root->left = insert(root->left, target);
	else root->right = insert(root->right, target);
	/*root->size = 0;
	if (root->left != NIL)root->size += root->left->size;
	if (root->right != NIL)root->size = root->right->size;*/
	update_size(root);
	return root;
}
void clear(Node* root) {
	if (root == NIL)return;
	clear(root->left);
	clear(root->right);
	clear(root);
	return;
}
int search(Node* root, int target) {
	if (root == NIL)return 0;
	if (root->val == target)return 1;
	if (root->val > target)return search(root->left, target);
	else return search(root->right, target);
}
Node* predecessor(Node* root) {
	Node* p = root->left;
	while (p != NIL && p->right != NIL)
		p = p->right;
	return p;
}
Node* erase(Node* root, int target) {
	if (root == NIL)return root;
	if (root->val > target)
		root->left = erase(root->left, target);
	else if (root->val < target)
		root->right = erase(root->right, target);
	else {
		/*if (root->right == NIL && root->left == NIL) {
			free(root);
			return NIL;
		}			
		else*/ 
		//这一步可以省略
		if (root->right == NIL || root->left == NIL) {
			Node* tmp = root->left != NIL ? root->left : root->right;
			free(root);
			return tmp;
		}
		else {
			Node* tmp = predecessor(root);
			root->val = tmp->val;
			root->left = erase(root->left, tmp->val);
		}
	}
	update_size(root);
	return root;
}
void in_order(Node* root) {
	if (root == NIL)return;
	in_order(root->left);
	printf("%d ", root->val);
	in_order(root->right);
	return;
}
//查找第k大的值
int find_k(Node* root, int k) {
	if (root->right->size >= k)
		return find_k(root->right, k);
	if (root->right->size + 1 == k)
		return root->val;
	return find_k(root->left, k - root->right->size - 1);
}
int main() {
	Node* root = NIL;
	srand(time(0));
	int n;
	scanf_s("%d", &n);
	for (int i = 0; i < n; i++) {
		int num = rand() % 100;
		printf("%d ", num);
		root = insert(root, num);
	}
	printf("\n");
	in_order(root);

	/*while (scanf_s("%d", &n) != EOF) {
		printf("delete node is %d\n", n);
		root = erase(root, n);
		in_order(root);
		printf("\n");
		printf("delete is success\n");
	}*/
	while (~scanf_s("%d", &n)) {
		printf("find_k(Node* root,%d) = %d\n", n, find_k(root, n));
	}
	return 0;
}
举报

相关推荐

二叉搜索树实现

0 条评论