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",
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", 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 条评论