二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:
- 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 任意节点的左、右子树也分别为二叉查找树。
- 没有键值相等的节点(no duplicate nodes)。
二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低,为O(log n),意味着树的所有节点平均深度为nlogn。。二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如集合、multiset、关联数组等。
二叉查找树应用广泛
1、二叉查找树用于排序
步骤:
1)构建二叉查找树BST;
2)中序遍历BST;
通过分析(算法导论里面有具体分析)可知,快速排序原理和二叉搜索树的构建是一致的,只不过比较的顺序不同。
BST具体实现如下:
<span style="font-size:18px;">#include<stdio.h>
typedef struct node
{
int value;
struct node* pleft;
struct node* pright;
}BNode;
void Visit(BNode *pRoot)
{
printf("%d\t",pRoot->value);
}
void InOrderTraverse(BNode *pRoot)
{
if(pRoot == NULL)
return;
InOrderTraverse(pRoot->pleft);
Visit(pRoot);
InOrderTraverse(pRoot->pright);
}
//由于可能改变指针位置,所以使用指针的引用作为形参
BNode* InsertBST(BNode *&root, int value)
{
if(root == NULL)
{
BNode* n = new BNode();
n->value = value;
n->pleft = NULL;
n->pright = NULL;
root = n;
return root;
}
if(root->value < value)
{
root->pright = InsertBST(root->pright, value);
}
else
{
root->pleft = InsertBST(root->pleft, value);
}
return root;
}
//由于可能改变指针位置,所以使用指针的引用作为形参
void InsertBST2(BNode *&root, int val)
{
BNode* n = new BNode();
n->value = val;
n->pleft = NULL;
n->pright = NULL;
if(!root)
{
root = n;
return;
}
BNode* tmp = root;
while(tmp)
{
if(tmp->value < n->value)
{
if(tmp->pright)
{
tmp = tmp->pright;
continue;
}
else
{
tmp->pright = n;
return;
}
}
else
{
if(tmp->pleft)
{
tmp = tmp->pleft;
continue;
}
else
{
tmp->pleft = n;
return;
}
}
}
}
int main()
{
BNode* pnode = NULL;
int data[8]= {3,2,6,3,8,6,1,4};
for(int i=0;i <8;i++)
{
//InsertBST2(pnode,data[i]);
InsertBST(pnode,data[i]);
}
InOrderTraverse(pnode);
return 0;
}
</span>