二叉搜索树是一种基于树形结构的查找算法.
它的生成方法是这样的:
每一棵树的左子子树的值总是小于父结点的值,右子树的值总是大于父结点的值..就是这样的...
下面是实现插入算法的代码:
struct Node
{
int data;
struct Node leftchild;
struct Node rightchild;
};
struct Node *root = NULL; //根结点
void insert(int element)
{
struct Node *preNode;
struc Node *currentNode = root;
while(currentNode!=NULL)
{
preNode = currentNode;
if(element>currentNode->data)
{
currentNode = currentNode->rightchild;
}
else
{
currentNode = currentNode->leftchild;
}
struct Node *pnew = new struct Node;
pnew->data = element;
pnew->leftchild = pnew->rightchild = NULL; //这步初始化空指针操作非常重要,相当于字符串操作中的'/0'
if(root == NULL)
{
root = pnew;
}
else
{
if(element > preNode->data)
{
preNode->rightchild = pnew;
}
else
{
preNode->leftchild = pnew;
}
}
}
}
//这个算法的思路是:不断的循环来找到那个插入位置,找到正确的位置,判断新增的结点是要做左子结点还是右子结点,然后生成一个新的树
虽然树形结构从形态上看是立体的,但是因为生成树时的思路,使得我们访问树时,使用了类似线性结构的处理方法,太奇妙了.
void find_node(int element)
{
struct Node *ptr = root;
while(ptr!=NULL &&ptr->data!=element)
{
if(element >ptr->info)
{
ptr = ptr->rightchild;
}
else
{
ptr = ptr->leftchild;
}
}
if(ptr==NULL)
{
return false;
}
else
{
return true;
}
}
//对于一个数据结构来说, 增 删 改 查 四种操作必不可少.我们现在实现了,增和查(查找函数改一下就变成repleace函数了),还差删除函数
//对于一棵搜索二叉树来说:删除结点的操作就没有那种容易了;
在对结点进行删除时,分为三种情况;
1 待删除的结点是叶子结点 leaf
2 待删除的结点还有一棵左子树或右子树
3 待删除的结点同时拥有左右子树
第一种情况 直接删除就OK啦
第二种情况, 将结点删除,然后将那结点的那棵不空的子树来顶替被删除的位置
第三种情况有两种选择:
1 从待删结点的左子树中找到最大值来替换待删结点.这样做仍会生成一棵二叉树.
2 从待删结点的右子树中找到最小值来替换待删除结点
我选择从第一种情况;
bool delete_node(int element)
{
//首先找到那个结点
struct *currentNode = root;
struct *preNode = NULL;
while(currentNode!=NULL && currentNode->data!=element)
{
preNode = currentNode;
if(element>currentNode->data)
{
currentNode = currentNode->rightchild;
}
else
{
currentNode = currentNode->leftchild;
}
}
if(current==NULL)
{
return false;
}
if(currentNode->left!=NULL && currentNode->right!=NULL) //如果左右子树都不为空的话,
{
struct Node*subcurrentNode = currentNode->leftchild;
struct Node *subptrNode = NULL;
while(subcurrentNode->rightchild!=NULL)
{
subcurrentNode = subcurrentNode->rightchild;
}
currentNode->data = subcurrent->data;
currentNode = subcurrentNode;
preNode = subptrNode;
}
struct Node *temp;
temp = (currentNode->left==NULL)?currentNode->rightchild:current->leftchild;
if(currentNode == root)
{
root = c;
}
else
{
if(currentNode == preNode->left)
{
preNode->left = c;
}
else
{
preNode->right = c;
}
}
}