2024-03-19 02:45:09 +08:00

151 lines
2.7 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
/**
* 二叉伸展树
* https://blog.csdn.net/u014634338/article/details/49586689
*/
struct tree;
#define bool int
#define false 0
#define true 1
#ifndef max
#define max(a, b) (((a) > (b)) ? (a) : (b))
#endif
typedef struct tree *prt_tree;
struct tree
{
int data; //数据
int height; //树深度
prt_tree lt; //左节点
prt_tree rt; //右节点
};
prt_tree create_tree(int data)
{
prt_tree tmp = malloc(sizeof(struct tree));
memset(tmp, 0, sizeof(struct tree));
tmp->data = data;
return tmp;
}
prt_tree add_tree(int data, prt_tree root)
{
if (root == NULL)
{
prt_tree tmp = create_tree(data);
return tmp;
}
if (root->data > data)
{
root->lt = add_tree(data, root->lt);
}
else if (root->data < data)
{
root->rt = add_tree(data, root->rt);
}
return root;
}
void splay_tree(prt_tree root, prt_tree tree);
prt_tree find_tree(prt_tree root, int val)
{
if (root == NULL)
{
return NULL;
}
prt_tree tmp = NULL;
if (root->data > val)
{
tmp = find_tree(root->lt, val);
}
else if (root->data < val)
{
tmp = find_tree(root->rt, val);
}
if (tmp != NULL)
{
splay_tree(root, tmp);
}
return root;
}
void l_rotate(prt_tree a, prt_tree b);
void r_rotate(prt_tree a, prt_tree b);
void splay_tree(prt_tree root, prt_tree tree)
{
if (tree == NULL)
{
return;
}
if (root->lt == tree)
{
l_rotate(root, tree);
}
else if (root->rt == tree)
{
r_rotate(root, tree);
}
}
void l_rotate(prt_tree a, prt_tree b)
{
int tmp = a->data;
a->data = b->data; //交换ab数据
b->data = tmp;
prt_tree tmpNode = a->rt;
a->rt = b;
a->lt = b->lt;
b->lt = b->rt;
b->rt = tmpNode;
}
void r_rotate(prt_tree a, prt_tree b)
{
int tmp = a->data;
a->data = b->data;
b->data = tmp; //交换ab数据
prt_tree tmpNode = a->lt;
a->lt = b;
a->rt = b->rt;
b->rt = b->lt;
b->lt = tmpNode;
}
bool find(prt_tree root, int val)
{
if (root->data == val)
{
return true;
}
prt_tree tmp = find_tree(root, val);
if (tmp == NULL || tmp == root)
{
return false;
}
return true;
}
void print_tree(prt_tree root) //中序输出就是排序啦
{
if (root == NULL)
{
return;
}
print_tree(root->lt);
printf("%d\t", root->data);
print_tree(root->rt);
}
int main()
{
prt_tree root = create_tree(201);
for (int i = 0; i < 20; i++)
{
root = add_tree(rand(), root);
}
int s = 0;
scanf("%d", &s);
find(root, s);
print_tree(root);
system("pause");
return 0;
}