定义:
一棵空树,或者是具有下列性质的二叉树:
- 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 左、右子树也分别为二叉排序树;
- 没有键值相等的结点。
结构体定义:
typedef struct BTNode
{
int key;
struct BTNode* lchild;
struct BTNode* rchild;
}BTNode;
二叉排序树的插入算法:
int BSTInsert(BTNode *&bt, int key)
{
if (bt == NULL) //当前为空指针时说明找到插入位置,创建新结点进行插入
{
bt = (BTNode*)malloc(sizeof(BTNode)); //创建新结点
bt->lchild = bt->rchild = NULL;
bt->key = key; //将待排关键字存入新结点内,插入成功,返回1
return 1;
}
else //如果结点不空,则查找插入位置,这部分和查找算法类似
{
if (key == bt->key) //关键字已存在于树中,插入失败,返回0
return 0;
else if (key < bt->key)
return BSTInsert(bt->lchild, key);
else
return BSTInsert(bt->rchild, key);
}
}
二叉排序树的构造算法:
掌握了二叉树的插入操作以后,二叉排序树的构造就变得非常简单。只需建立一棵空树,然后将关键字逐个插入到空树即可构造一棵二叉排序树。
void CreateBST(BTNode *&bt, int key[], int n)
{
int i;
bt = NULL; //将树清空
for (i = 0; i < n; i++) //调用插入函数,逐个插入关键字
{
BSTInsert(bt, key[i]);
}
}
中序遍历算法:
说明:由二叉排序树的定义可以知道,如果输出二叉排序树的中序遍历序列,则这个序列是非递减有序的。
void inorder(BTNode* bt) /*中序遍历*/
{
if (bt != NULL)
{
inorder(bt->lchild);
cout << bt->key<<"\n";
inorder(bt->rchild);
}
}
测试该图:
void main()
{
BTNode* bt=NULL;
int key[] = { 8,10,1,6,4,7,13,3,14 };
CreateBST(bt, key, 9);
inorder(bt);
}
测试结果: