定义
它的本质上是一颗二叉树,只拥有俩个子结点
它的性质有以下几点:
1.若它的左子树不空,则左子树上所有结点的值均小于它根结点的值。
2.若它的右子树不空,则右子树上所有结点的值均大于它根结点的值。
3.它的左、右树又分为⼆叉排序树
那么接下来还是以图的方式进行理解吧
首先给出一排数字:4 , 1 , 3 , 16 , 12 , 9 , 11 , 19 , 7 , 10 ,将他们依次放入树中
在这整颗树中,你可发现,根节点4的左边全是小于它的,在根结点4的右边全是大于它的
而这时你遍历中序遍历的时候,你就会发现它们全都是从小到大排列的,因为中序遍历的顺序是左根右,那不就是以根为先把比根大的遍历完,再遍历小的了嘛
接下来就是代码实现了
二叉搜索树的初始化
void intitree(root &s,int fatheroot)
{
s = (root)malloc(sizeof(node));
if (s == NULL)printf("分配内存失败");
s->left = NULL; //将左右结点变为空
s->right = NULL;
s->date = fatheroot; //赋值给根节点
}
插入数据
void inserttree(root s, int x)
{
root temp = s; //用来指向插入结点的前一个结点
root prev = NULL; //用来保存插入的结点
while (temp!=NULL) //不断找插入结点的前一个结点
{
prev = temp;
if (x < temp->date) {
temp = temp->left;
}
else if (x > temp->date) {
temp = temp->right;
}
else return;
}
if (x < prev->date) //判断到底是在左边还是右边
{
prev->left = (root)malloc(sizeof(node));
prev->left->date = x;
prev->left->left = NULL;
prev->left->right = NULL;
}
if (x > prev->date)
{
prev->right = (root)malloc(sizeof(node));
prev->right->date = x;
prev->right->left = NULL;
prev->right->right = NULL;
}
}
那么接下来,如果我想查找一个数,应该是怎么查找的呢,我们是按二叉搜索树的性质进行查找的,因为我们一旦找到了谁比谁大,就能排除掉一半的数据,例如9,那是不是8左边的数据都比9小了呢,所以这个还比一般的查找时间要快一下
查找
void serch(root s, int x)
{
root temp=s;
while (temp != NULL) //不断的搜索整颗树
{
if (temp->date == x)
{
printf("有这个数");
return ;
}
if (temp->date > x)temp = temp->left; //找左边的树
else if (temp->date < x)temp = temp->right; //找右边的树
}
printf("没有这个数");
}