二叉查找树的基本操作有查找、插入、建树、删除
查找操作
在之前介绍的二叉树的查找操作时,由于无法确定二叉树的具体特性,因此只能对左右子树都进行递归遍历,但是二叉查找树的性质决定了可以只选择其中的一种进行遍历,因此查找将会是从树根到查找结点的一条路径,故最坏复杂度为O(h),其中h是二叉查找树的高度,于是可以得到查找操作的基本思路
- 如果当前根结点root为空,说明查找失败,返回
- 如果需要查找的值x等于当前根结点的数据域root->data,说明查找成功,访问
- 如果需要查找的值x小于当前根结点的数据域root->data,说明应该在左子树中查找,因此向root->lchild递归
- 如果需要查找的值x大于当前根结点的数据域root->data,说明应该在右子树中查找,因此向root->rchild递归
由此可以得到代码:
void search(node *root,int x){
if(root==NULL){
printf("search failed\n");
return;
}
if(x==root->data){
printf("%d\n",root->data);
}else if(x<root->data){
search(root->lchild,x);
}else{
search(root->rchild,x);
}
}
可以看到,和普通二叉树的查找函数不同,二叉查找树的查找在于对左右子树的选择递归。在普通二叉树中,无法确定需要查找的值x到底是在左子树还是在右子树上,但