二叉排序树(Binary Search Tree,BST)是一种二叉树,它满足以下条件:
-
对于每个节点,它的左子树中所有节点的值小于它本身的值。
-
对于每个节点,它的右子树中所有节点的值大于它本身的值。
-
左子树和右子树都是二叉排序树。
void buildpaixutree(tree* t, int x)
{
if (*t == NULL)
{
t = (treenode)malloc(sizeof(treenode));
(*t)->data = x;
(*t)->lchild = NULL;
(*t)->rchild = NULL;
}
else if ((*t)->data < x)
{
buildpaixutree(&((*t)->rchild), x);
}
else if ((*t)->data > x)
{
buildpaixutree(&((*t)->lchild), x);
}
}
二叉排序树的主要应用是实现快速查找和排序。在一个二叉排序树中,每个节点都可以看作是一个"桶",存储了一个关键字和对应的值。通过比较关键字的大小,可以快速定位到某个节点,并进行插入、删除和查找操作。另外,对二叉排序树进行中序遍历,可以得到关键字的有序序列,从而实现排序功能。
二叉排序树的缺点是它的形态高度依赖于插入顺序,如果插入的数据是有序的,那么二叉排序树将会退化成一条链表,查找效率大大降低。为了避免这个问题,常见的做法是使用平衡二叉树,如AVL树、红黑树等。
完整测试代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct treenode
{
int data;
struct treenode* lchild, * rchild;
}treenode, * tree;
void buildpaixutree(tree* t, int x)
{
if (*t == NULL)
{
*t = (treenode*)malloc(sizeof(treenode));
(*t)->data = x;
(*t)->lchild = NULL;
(*t)->rchild = NULL;
}
else if ((*t)->data < x)
{
buildpaixutree(&((*t)->rchild), x);
}
else if ((*t)->data > x)
{
buildpaixutree(&((*t)->lchild), x);
}
}
void paixu(tree* t)
{
int i = 0;
int a = 0;
srand(time(0));
for (i = 0; i < 10; i++)
{
buildpaixutree(t,rand()%100);
}
}
void disp(tree* t)
{
if (*t)
{
disp(&(*t)->lchild);
printf("%d ", (*t)->data);
disp(&(*t)->rchild);
}
}
int main()
{
tree t = NULL;
paixu(&t);
printf("二叉树排序树为:");
disp(&t);
return 0;
}