二叉查找树(英语:Binary Search Tree),也称二叉搜索树、有序二叉树(ordered binary tree),排序二叉树(sorted binary tree)
二叉查找树的性质:
1.任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
2.任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
3.任意节点的左、右子树也分别为二叉查找树;
4.没有键值相等的节点。
二叉查找树的优点:
二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低。为O(log n)。二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如集合、multiset、关联数组等。
二叉查找树的查找过程和次优二叉树类似,通常采取二叉链表作为二叉查找树的存储结构。中序遍历二叉查找树可得到一个关键字的有序序列,一个无序序列可以通过构造一棵二叉查找树变成一个有序序列,构造树的过程即为对无序序列进行查找的过程。每次插入的新的结点都是二叉查找树上新的叶子结点,在进行插入操作时,不必移动其它结点,只需改动某个结点的指针,由空变为非空即可。搜索、插入、删除的复杂度等于树高,期望 O(log n),最坏 O(n)(数列有序,树退化成线性表)。
虽然二叉查找树的最坏效率是O(n),但它支持动态查询,且有很多改进版的二叉查找树可以使树高为 O(log n),如SBT,AVL树,红黑树等。故不失为一种好的动态查找方法。
以下为二叉搜索树的插入和查找.
#include<iostream>
using namespace std;
/******二叉树节点 ****/
typedef struct node{
int data;
struct node *lchild;
struct node *rchild;
}Node;
/*******二叉树 *****/
typedef struct{
node *root;
}Tree;
/******二叉树的创建与初始化 ****/
Tree* new_tree(){
Tree *tree= new Tree;
tree->root=NULL;
return tree;
}
/********二叉树节点的创建与初始化 *****/
Node* new_node(int v){
Node *node = new Node;
node->data = v;
node->lchild = NULL;
node->rchild = NULL;
return node;
}
/*****插入******/
void insert(Tree* tree,int v){
if(tree->root == NULL)
tree->root = new_node(v);
else{
Node* p= tree->root;
Node* pre=p;
while(p != NULL){
pre=p;
if(v < p->data)
p=p->lchild;
else if( v > p->data)
p=p->rchild;
else
return;
}
if(v < pre->data)
pre->lchild = new_node(v);
else
pre->rchild = new_node(v);
}
}
/*******查找****/
Node* search(Tree *tree,int v){
Node* p = tree->root;
while(p != NULL){
if(v < p->data)
p=p->lchild;
else if(v > p->data)
p=p->rchild;
else
return p;
}
return NULL;
}
/***先序遍历*****/
void preOrder(Node *node){
if(node != NULL){
cout<<node->data<<" ";
preOrder(node->lchild);
preOrder(node->rchild);
}
}
int main(){
Tree *tree= new_tree();
int a[6]={5,9,7,2,1,8};
for(int i=0;i<6;i++)
insert(tree,a[i]);//bst插入
/****bst查找 ****/
Node *p=search(tree,2);
if(p!=NULL)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
/****bst遍历*****/
cout<<"preOrder:"<<endl;
preOrder(tree->root);
return 0;
}