二叉排序树的实现
二叉排序树(简称BST)又称二叉查找(搜索)树,其定义为:二叉排序树或者是空树或者是满足如下性质的二叉树:
1.若它的左子树不为空,则左子树上所有的结点的值都小于根结点的值
2.若它的右子树不为空,则右子树上的所有节点的值都大于跟结点 的值
3.它的左右子树也分别为二叉搜索树
二叉排序树还有一个重要的性质:中序遍历二叉排序树所得到的中序序列是一个递增的有序数列
在讨论二叉树之前,先得定义结点:
每个结点中包含自己本身的关键码,还包含他的左孩子结点与右孩子结点
typedef char SearchTreeType;
typedef struct SearchTreeNode
{
SearchTreeType key;//关键码
SearchTreeNode *lchild;
SearchTreeNode *rchild;
}SearchTreeNode;
向二叉树中插入元素,插入元素后要保证得到的二叉树还得保持二叉排序树的性质,插入时,先应该创建一个新结点,这个新节点的码就是要插入的码,用这个结点的码与二叉树进行比较,若key大于二叉树根节点的key,则需要递归调用插入函数,但是插入函数中的参数root变为了root的右子树,直到找到根节点为空时,将新节点插入在这个位置。若key小于二叉树根节点的key,与上面的过程类似,就是递归参数变为了root的左子树。代码如下:
void SearchTreeInsert1(SearchTreeNode **root, SearchTreeType key)
{
if (root == NULL)
return;
SearchTreeNode* newnode = CreateNewNode(key);
if (*root == NULL) //空树
{
*root = newnode;
return;
}
if ((*root)->key > key)
{
SearchTreeInsert1(&(*root)->lchild, key);
return;
}
else if ((*root)->key < key)
{
SearchTreeInsert1(&(*root)->rchild, key);
return;
}
}
二叉树上的查找,因为这是一个二叉排序树,所以查找时是一个逐渐缩小范围的过程,用当前根节点与要查找的key继续比较,若小于key,则递归调用查找函数在其右子树中继续查找,若大于key,则在其左子树中继续查找,如果,两个值相等,则表示找到了该元素,要是root结点为空时,则表示并没有此元素。
SearchTreeNode* SearchTreeFind1(SearchTreeNode *root, SearchTreeType to_find)
{
if (root == NULL) //空树
return 0;
if (root->key < to_find)
{
SearchTreeFind1(root->rchild, to_find);
return 0;
}
else if (root->key>to_find)
{
SearchTreeFind1(root->lchild, to_find);
return 0;
}
else
return root;
}
二叉排序树的删除,删除二叉树中的某个元素时,只能删除他自己,不能将其子树也一起删掉,所以不仅需要删除该节点,还需要将其子树做一定的调整,得保证删除节点后的二叉树还是二叉排序树。所以需要分情况讨论,根据要删除节点的子树情况不同来讨论。
void SearchTreeRemove1(SearchTreeNode **root, SearchTreeType key)
{
if (NULL == root)
return;
if (NULL == *root)
return;