标题：二叉查找树
目录
概述1 二叉排序树的查找算法 
2 在二叉排序树插入结点的算法 
3 在二叉排序树删除结点的算法二叉排序树的查找算法：在二叉排序树b中查找x的过程为： 
若b是空树，则搜索失败，否则： 
若x等于b的根结点的数据域之值，则查找成功；否则： 
若x小于b的根结点的数据域之值，则搜索左子树；否则：查找右子树。 
二叉排序树b插入结点s的过程：若b是空树，则将s所指结点作为根结点插入，否则： 
若s->data等于b的根结点的数据域之值，则返回，否则： 
若s->data小于b的根结点的数据域之值，则把s所指结点插入到左子树中，否则： 
把s所指结点插入到右子树中。在二叉排序树删除结点的算法：在二叉排序树删去一个结点，分三种情况讨论： 
若*x结点为叶子结点，即xL(左子树)和xR(右子树)均为空树。由于删去叶子结点不破坏整棵树的结构，则只需修改其双亲结点的指针即可。 
若*x结点只有左子树xL或右子树xR，此时只要令xL或xR直接成为其双亲结点*parent的左子树或者右子树即可，作此修改也不破坏二叉排序树的特性。 
若*x结点的左子树和右子树均不空。在删去*x之后，为保持其它元素之间的相对位置不变，可按中序遍历保持有序进行调整，可以有两种做法：其一是令*x的左子树为*parent的左子树，*xsucc为*f左子树的最右下的结点，而*x的右子树为*xsucc的右子树；其二是令*x的直接前驱（或直接后继）替代*x，然后再从二叉排序树中删去它的直接前驱（或直接后继）。
中序后继结点替换要删除的节点：从x的右儿子开始，一直靠左往下走，最后到达的节点就是所需的后继结点，程序中用xsucc指向这个后继结点，现在只需删除xsucc指向的节点，可以根据情况1或者是情况2中的方法来删除它。
C++实现：
//BST:Binary Search Tree(二叉搜索树)
#include<iostream>
#include<cstdlib>
using namespace std;
template<class DataType>
class BST
{
private:
class Node
{
public:
DataType data;
Node *left,*right;
Node():left(NULL),right(NULL){}
Node(DataType item):data(item),left(NULL),right(NULL){}
}; 
typedef Node* Nodepointer;
public:
BST();
bool Empty() const;
bool Search(const DataType & item) const;
bool Search(const DataType & item,bool & found,Nodepointer & local,Nodepointer & parent); 
void Insert(const DataType & item);
void Delete(const DataType & item);
private:
Nodepointer root;
};
template<class DataType> //构造函数 
inline BST<DataType>::BST()
{
root=NULL;
}
template<class DataType>//是否为空 
inline bool BST<DataType>::Empty() const
{
return root==NULL;
}
template<class DataType>//查找 
bool BST<DataType>::Search(const DataType & item) const
{
Nodepointer local=root;
bool found=false;
while(1)
{
if(found||local==NULL) break;
if(item<local->data) local=local->left;
else if(item>local->data) local=local->right;
else found=true;
}
return found;
}
template<class DataType>//用于删除函数的查找 
bool BST<DataType>::Search(const DataType & item,bool & found,Nodepointer & local,Nodepointer & parent)
{
local=root;
parent=NULL;
found=false;
while(1)
{
if(found||local==NULL) break;
if(item<local->data)
{
parent=local;
local=local->left;
}
else if(item>local->data)
{
parent=local;
local=local->right;
}
else found=true;
}
}
template<class DataType>//删除 
void BST<DataType>::Delete(const DataType & item)
{
Nodepointer x,// 指向包含项的节点 
parent;//x 和 xsucc的父亲 
bool found;
Search(item,found,x,parent);
if(!found)
{
cout<<"Item not in the BST\n";
return ;
}
if(x->left!=NULL&&x->right!=NULL)//处理有两个儿子的节点 
{
Nodepointer xsucc=x->right;
parent=x;
while(xsucc->left!=NULL)
{
parent=xsucc;
xsucc=xsucc->left;
}
x->data=xsucc->data; //把xsucc的内容移到x，并令x指向后继，该后继将被删除 
x=xsucc;
}
Nodepointer subtree=x->left; //处理有0个或者1个儿子的情况
if(subtree==NULL) subtree=x->right;
if(parent==NULL) root=subtree;
else if(parent->left==x) parent->left=subtree;
else parent->right=subtree;
delete x;
} 
template<class DataType>// 插入 
void BST<DataType>::Insert(const DataType & item)
{
Nodepointer local=root,parent=NULL;
bool found=false;
while(1)
{
if(found||local==NULL) break;
parent=local;
if(item<local->data) local=local->left;
else if(item>local->data) local=local->right;
else found=true;
}
if(found) cerr<<"Item already in the tree\n";
else
{
local=new Node(item);
if(parent==NULL) root=local;
else if(item<parent->data) parent->left=local;
else parent->right=local;
}
}
int main()
{
char d[7]={'O','E','T','C','U','M','P'};
BST<char> chartree;
for(int i=0;i<7;++i)
chartree.Insert(d);
if(chartree.Search('E')) cout<<"Found!\n";
chartree.Delete('E');
if(!chartree.Search('E')) cout<<"E is deleted\n";
system("pause");
return 0;
}二叉排序树性能分析每个结点的Ci为该结点的层次数。最坏情况下，当先后插入的关键字有序时，构成的二叉排序树蜕变为单支树，树的深度为n，其平均查找长度为\frac{n+1}{2}（和顺序查找相同），最好的情况是二叉排序树的形态和折半查找的判定树相同，其平均查找长度和log2(n)成正比（O(log2(n))）。
Deleting a node with two children from a binary search tree