可以为空,若不为空则与根相比左小右大,左右子树也都是二叉搜索树;
二叉搜索树的中序遍历是从小到大递增的;
一般定义结构体:
typedef struct Node* Tree;
struct Node
{
ElementType Data;
Tree Left;
Tree Right;
};
在二叉搜索树中查找X(用二分查找法)
查找的时间复杂度大致为o(log2 n) 最坏情况为线性时o(n);
Tree Find(Tree T, ElementType X) 非递归,查找X并返回该结点指针,找不到返回NULL;
{
while(T)
{
if(X < T->Data)
T = T->Left;
else if(X > T->Data)
T = T->Right;
else
return T;
}
return NULL;
}
Tree Find(Tree T, ElementType X) 递归查找
{
if(!T)
return NULL;
if(X < T->Data)
return Find(T->Left, X);
else if(X > T->Data)
return Find(T->Right, X);
else
return T;
}
插入:
Tree Insert(Tree T, ElementType X) 将X插入并返回根结点指针
{
if(!T)
{
T = (Tree)malloc(sizeof(struct Node));
//T = new Node; //(c++);
T->Data = X;
T->Left = T->Right = NULL;
}
else if(X < T->Data)
T->Left = Insert(T->Left, X);
else if(X > T->Data)
T->Right = Insert(T->Right, X);
return T;
}
删除:
删除的结点如果是叶结点,直接删除就行;
如果删除结点有一个儿子,则把儿子拎上来代替其位置;
如果删除结点有两个儿子,则有两种方法(最大、最小值结点为叶结点):
1:找该结点左子树的最大值的结点,然后把值赋给该结点,再删除最大值的结点;
2:找该结点右子树的最小值的结点,然后把值赋给该结点,再删除最小值的结点;
Tree Delete(Tree T, ElementType X)
{
Tree T2;
if(!T)
return NULL;
else if(X < T->Data)
T->Left = Delete(T->Left, X);
else if(X > T->Data)
T->Right = Delete(T->Right, X);
else
{
if(T->Left && T->Right)
{
T2 = FindMin(T->Right); 右子树的最小值的结点
T->Data = T2->Data;
T->Right = Delete(T->Right, T2->Data);
或者
/*
T2 = FindMax(T->Left); 左子树的最大值的结点
T->Data = T2->Data;
T->Left = Delete(T->Left, T2->Data);
*/
}
else
{
T2 = T;
if(!T->Left)
T = T->Right;
else if(!T->Right)
T = T->Left;
free(T2);
//delete T2; //(c++)
}
}
return T;
}