二叉排序树的查找-插入-删除
何谓二叉排序树
定义:二叉排序树又称二叉查找树,它或者是一颗空树,或者是具有以下性质的二叉树
1:若它的左子树不空,则左子树上所有节点的值均小于该节点的值。
2:若它的右子树不空,则右字树上所有节点的值均大于该节点的值。
3:它的左右子树也分别为二叉排序树。
时间复杂度:O(h) = log(n) 查找插入以及删除算法时间复杂度均为此
二叉排序树的创建
创建一个二叉排序树,可使用前序创建等,看自己习惯,这里采用前序创建
typedef struct Bitree
{
char Elem;
struct Bitree*left;
struct Bitree*right;
}Bitree;
void CreateBtree(Bitree* &PNode)
{
char num;
cin >> num;
if (num == '#')
PNode = NULL;
else
{
PNode = new Bitree;
PNode->Elem = num;
CreateBtree(PNode->left);
CreateBtree(PNode->right);
}
}
二叉排序树的查找
该二叉排序树已排好序,故进行查找时只需沿着一条分支往下走即可查找到该值。
char SearchBT(Bitree*PNode,char key)
if(PNode == NULL)
return '0';
else if(key == PNode->Elem)
return PNode->Elem;
else if(key<PNode->Elem)
return SearchBT(PNode->left);
else
return SearchBT(PNode->right)
二叉排序树的插入
插入元素至一二叉排序树,原理类似于二叉排序树的查找操作,可先对其进行查找操作,对Key进行查找的过程中即对其位置进行了估计,后可直接对查找到为NULL的前一个节点进行插入操作。
char InsertTree(Bitree *&PNode,char key)
{
Bitree*FNode, *NodeLeft, *NodeRight;
//插入操作,本次查找 插入 删除均基于char型进行书写
if (SearchBST(PNode,FNode,NodeLeft,NodeRight,key) == '0')
//即待查找元素不在二叉树中
{
Bitree *s = new Bitree;
s->Elem = key;
s->left = s->right = NULL;
if (key < FNode->Elem)
FNode->left = s;
else
FNode->right = s;
Bianli(PNode);
return '1';
}
return '0';
}
char SearchBST(Bitree *&PNode,Bitree *&FNode,Bitree *&NodeLeft,Bitree *&NodeRight,char key)
{
//PNode:根节点 FNode:代查找节点的父节点 NodeLeft:左孩子节点 NodeRight:右孩子节点
//查找操作
if (PNode == NULL)
return '0';
if (key == PNode->Elem)
{
FNode = PNode;
return PNode->Elem;
}
if (key < PNode->Elem)
{
FNode = PNode;
NodeLeft = PNode->left;
return SearchBST(PNode->left, FNode, NodeLeft, NodeRight, key);
}
else if (key>PNode->Elem)
{
FNode = PNode;
NodeRight = PNode->right;
return SearchBST(PNode->right, FNode, NodeLeft, NodeRight, key);
}
}
二叉排序树的删除
二叉排序树的删除操作可分为以下四种情况:
1:待删除节点无左子树亦无右子树,直接删除该节点即可。
2:待删除节点有左子树,无右子树,直接删除该节点,让其父节点指向其左子树节点。
3:待删除节点无左子树,有右子树,直接删除该节点,让其父节点指向其右子树节点。
4:待删除节点有左子树,有右子树,寻找其后继节点,让后继节点值代替该节点后删除后继节点原先指针。
char DeleteBi(Bitree *&PNode)
{
Bitree *temp;
if (PNode->left == NULL && PNode->right == NULL)
{
//必须将其置空后删除,否则易产生野指针
PNode = NULL;
delete PNode;
}
else if (PNode->left == NULL && PNode->right != NULL)
{
temp = PNode;
PNode = PNode->right;
delete temp;
}
else if (PNode->left != NULL && PNode->right == NULL)
{
temp = PNode;
PNode = PNode->left;
delete temp;
}
else
//即待删除节点左右节点均不为空,此时找到该节点的后继节点,用后继节点代替该节点,方便后续红黑树操作
{
temp = PNode;
Bitree *s = PNode->right;
while (s->left)
{
temp = s;
s = s->left;
}
PNode->Elem = s->Elem;
if (temp != PNode)
temp->left = s->right;
else
temp->right = s->right;
s = NULL;
delete(s);
}
return '1';
}
至此该二叉排序树基本知识已了解,后续创建二叉树时,可通过创建int型变量代替所提char型变量。
该完整代码在以下链接进行下载:
http://download.csdn.net/download/dream__tt/10112306