数据结构算法—在二叉排序树中查找key
题目:编写程序实现下面运算:在二叉排序树中查找关键字为key的记录。
查找算法思想:
二叉排序树的构造,根据 插入的key的值,决定是左孩子还是右孩子。
查找的过程,就是一个 遍历二叉树的 过程。 查找的key值,比 当前结点的值大,就深入下一层的右孩子, 比当前结点的值小,就深入下一层的左孩子。
二叉排序树 存储结构:
typedef struct node{
int info; // 值
struct node *lchild,*rchild; // 左孩子,右孩子
}BSTNode,*BSTree;
二叉排序树的构造
/* 插入 结点 */
void InsertNode(BSTree *bt,int key){
BSTree s; // 创建一个结点
if(*bt==NULL){ // 二叉树为空时,生成根节点,左右子树都为NULL
s=(BSTree)malloc(sizeof(BSTNode));
s->info = key;
s->lchild = NULL;
s->rchild = NULL;
*bt = s;
}
else{ // 不为空, 根据key的值,决定插入到左子树还是右子树
if(key<(*bt)->info)
InsertNode(&((*bt)->lchild),key);
else
InsertNode(&((*bt)->rchild),key);
}
}
void creatBST(BSTree *bt){ // 构造二叉排序树
int key;
*bt = NULL;
scanf("%d",&key); // 读入 key 值
while(key!=0){ // key == 0 读取结束,二叉排序树序列生成完毕
InsertNode(bt,key);
scanf("%d",&key);
}
}
先序遍历二叉排序树
void preOrder(BSTree bt){ // 先序遍历二叉排序树 是一个 递增的序列
if(bt!= NULL){
printf("%d",bt->info);
preOrder(bt->lchild);
preOrder(bt->rchild);
}
}
// 想要 中序,后序遍历,修改 if 里的语句顺序即可
完整代码
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int info; // 值
struct node *lchild,*rchild; // 左孩子,右孩子
}BSTNode,*BSTree;
/* 插入 结点 */
void InsertNode(BSTree *bt,int key){
BSTree s; // 创建一个结点
if(*bt==NULL){ // 二叉树为空时,生成根节点,左右子树都为NULL
s=(BSTree)malloc(sizeof(BSTNode));
s->info = key;
s->lchild = NULL;
s->rchild = NULL;
*bt = s;
}
else{ // 不为空, 根据key的值,决定插入到左子树还是右子树
if(key<(*bt)->info)
InsertNode(&((*bt)->lchild),key);
else
InsertNode(&((*bt)->rchild),key);
}
}
void creatBST(BSTree *bt){ // 构造二叉排序树
int key;
*bt = NULL;
scanf("%d",&key); // 读入 key 值
while(key!=0){ // key == 0 读取结束,二叉排序树序列生成完毕
InsertNode(bt,key);
scanf("%d",&key);
}
}
void preOrder(BSTree bt){ // 先序遍历二叉排序树 是一个 递增的序列
if(bt!= NULL){
printf("%d",bt->info);
preOrder(bt->lchild);
preOrder(bt->rchild);
}
}
BSTree searchBST(BSTree bt,int key){ // 查找
if(!bt) // 二叉树为空,结束查找
return NULL;
else{ // 二叉树不为空 key的值和 左右子树比较大小
if(bt->info == key) // 查找成功
return bt;
else if(bt->info >key){ // 二叉树的值 大于 key的值,去左子树寻找
return searchBST(bt->lchild,key);
}
else if(bt->info < key){ // 二叉树的值 小于key的值,去右子树寻找
return searchBST(bt->rchild,key);
}
}
}
int main(){
BSTree bt,result;
int key;
printf("输入要建立的二叉排序树:\n");
creatBST(&bt);
printf("二叉排序树的先序序列为:");
preOrder(bt);
printf("\n请输入要查找的元素:");
scanf("%d ",&key);
result = searchBST(bt,key);
if(result==NULL){
printf("未找到!");
}
else {
printf("要查找的元素 %d",result->info);
}
}