/***********************************************************/
/**************** 二叉排序树 (143页——145页)**********
算法6.13【二叉排序树插入新结点的递归算法】
算法6.14【二叉排序树插入新结点的非递归算法】
算法6.15【二叉排序树的生成算法】
************************************************************/
#include <stdlib.h>
#include <stdio.h>
/*********二叉排序树的结点类型定义(143页)********************/
typedef int keytype;
typedef int datatype;
typedef struct node {
keytype key; //关键字项
//datatype other; //其他数据项
struct node *lchild, *rchild; // 左右指针域
} bstnode;
/******************************************************************
算法6.13【二叉排序树插入新结点的递归算法】(144页)
************************************************************/
bstnode *INSERTBST1(bstnode *&t, bstnode *s )
// t为二叉排序树的根指针,s为插入的结点指针
{
if (t == NULL)
t = s; //原树为空, 返回s作为根指针
else {
if (s->key < t->key)
INSERTBST1( t->lchild, s ); //在左子树中查找插入位置
else
INSERTBST1( t->rchild, s ); //在右子树中查找插入位置
}
return t;
}// INSERTBST1
/******************************************************************
算法6.14【二叉排序树插入新结点的非递归算法】(144页)
************************************************************/
bstnode *INSERTBST2(bstnode *&t, bstnode *s )
// t为二叉排序树的根指针,s为插入的结点指针
{
bstnode *f, *p;
p = t;
while (p != NULL) {
f = p; //f指向*p结点双亲
if (s->key == p->key)
return NULL; //树中已有结点*s,无须插入
if (s->key < p->key)
p = p->lchild; //在左子树中查找插入位置
else
p = p->rchild; //在右子树中查找插入位置
}
if (t == NULL) {
t = s; //原树为空, 返回s作为根指针
} else {
if (s->key < f->key)
f->lchild = s; //将*s插入为*f的左孩子
else
f->rchild = s; //将*s插入为*f的右孩子
}
return t;
}// INSERTBST2
/******************************************************************
算法6.15【二叉排序树的生成算法】(144页)
************************************************************/
bstnode *CREATBST( ) {
//生成二叉排序树
bstnode *t, *s;
keytype keyvalue, endflag = 0; //endflag为结点结束标志
//datatype data;
t = NULL; // 设置二叉排序树的初态为空树
printf("输入结点的关键字值,结束标志为0\n");
scanf("%d", &keyvalue); //读入一个结点的关键字
while (keyvalue != endflag) { // 输入非结束标志,执行以下操作
s = (bstnode *)malloc(sizeof(bstnode)); //申请新结点
s->lchild = s->rchild = NULL; //新结点指针域置空
s->key = keyvalue;
/*
printf("输入结点的其他数据值\n")
scanf ("%d", &data); //读入结点的其他数据
s->other = data;
*/
INSERTBST2(t, s); //将新结点插入树t中,调用INSERTBST1或INSERTBST2
scanf("%d", &keyvalue); //读入下一个结点的关键字
}
return t;
}
///*
int SearchBST(bstnode *bt, keytype k) {
//以递归方式输出从根节点到查找到的节点的路径
if (bt == NULL) {
return 0;
} else if (k == bt->key) {
//printf("%3d %3c", bt->key, bt->other);
printf("%3d", bt->key);
return 1;
} else if (k < bt->key) {
printf("%3d", bt->key);
return SearchBST(bt->lchild, k); //在左子树中递归查找
} else {
printf("%3d", bt->key);
return SearchBST(bt->rchild, k); //在右子树中递归查找
}
}
//*/
void show(bstnode *t) {
if (t == NULL) {
return;
}
show(t->lchild);
printf("%3d", t->key);
show(t->rchild);
}
int main() {
bstnode *tree;
tree = CREATBST( );
printf("生成的二叉排序树为\n");
show(tree);
printf("\n");
keytype val;
printf("输入要查找的结点\n");
scanf("%d", &val);
printf("以递归方式输出从根节点到所查结点%d的路径\n", val);
SearchBST(tree, val);
return 0;
}
//测试样例1 (教材第145页图6.20)
// 输入关键字序列 6 2 8 4 9 7 2 0
//测试样例2 (教材第145页图6.20)
// 输入关键字序列 8 4 2 9 6 7 2 0