二叉排序树的定义
二叉排序树,又称二叉查找树,我们这样定义:树非空,对于任意结点存在左子树或右子树,则左子树上所有结点的关键字均小于该结点的关键字,右子树上所有结点的关键字均大于该节点的关键字,这样的二叉树叫二叉排序树。即:
左子树结点值<根结点值<右子树结点值
还有一个默认规定,在二叉排序树中,不能有两个结点关键字相同。
二叉排序树的查找
定义一个二叉树的结构:
typedef struct BSTNode {
int data;
struct BSTNode* lchild;
struct BSTNode* rchild;
}BSTNode,* BSTree;
查找算法的基本思路是,从根节点开始,目标值更小的往左找,目标值更达的往右找,知道目标值和结点值相同,返回该结点。通过递归的方式实现:
BSTNode* Search(BSTree T, int k) {
if (T == NULL)
return NULL;
if (k == T->data)
return T;
else if (k < T->data)
return Search(T->lchild, k);
else
return Search(T->rchild, k);
}
二叉排序树的插入
插入算法的设计思路与查找类似,采用递归的方式,将待插入结点的关键字值与树中各个结点的关键字值进行比较,若小于则向左走,若大于则向右走,知道找到一个空结点,将新结点插入。从算法的实现方式上,我们可以知道,插入结点一定都是叶子结点。下面是算法实现:
Status BST_Insert(BSTree* T, int k) {
if ((*T) == NULL) {
(*T) = (BSTree)malloc(sizeof(BSTNode));
if (!(*T))exit(OVERFLOW);
(*T)->data = k;
(*T)->lchild = (*T)->rchild = NULL;
return OK;//插入成功
}
else if (k == (*T)->data)return ERROR;//插入失败
else if (k < (*T)->data)return BST_Insert(&(*T)->lchild, k);
else return BST_Insert(&(*T)->rchild, k);
}
二叉排序树的删除
删除算法的实现较为复杂,主要需要考虑结点的类型,来分门别类进行讨论。首先分析,一个结点会有三种情况:
1.该结点是叶子结点,那么可以直接删除;
2.结点只含有左子树或右子树,在删除该节点后,用其子树代替其在原先的位置;
3.结点既含有左子树,有含有右子树,这里有两种处理方法。在待删除结点的位置,可以用待删除结点的后继结点来替代,然后删除后继结点;或者是用待删除的结点的前驱结