上次我们介绍了静态查找表查找算法的实现,这次介绍二叉排序树(动态查找表)查找算法的实现。
还是老规矩:
程序在码云上可以下载。
地址:https://git.oschina.net/601345138/DataStructureCLanguage.git
看二叉排序树之前需要先了解一下二叉树的基本概念以及算法的实现,需要的童鞋可以参考《数据结构编程笔记十四:第六章 树和二叉树 二叉树基本操作及四种遍历算法的实现》。在此不再赘述。
二叉排序树是一种特殊的二叉树,左孩子结点值总小于根结点,右孩子结点值总大于根结点。(又是递归定义!)
一起看看代码实现吧:
//>>>>>>>>>>>>>>>>>>>>>>>>引入头文件<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
#include <stdio.h> //使用了标准库函数
#include <stdlib.h> //使用了动态内存分配函数
//>>>>>>>>>>>>>>>>>>>>>>自定义符号常量<<<<<<<<<<<<<<<<<<<<<<<<<<<
#define OVERFLOW -2 //内存溢出错误常量
#define OK 1 //表示操作正确的常量
#define ERROR 0 //表示操作错误的常量
#define TRUE 1 //表示逻辑正确的常量
#define FALSE 0 //表示逻辑错误的常量
#define EQ(a,b) ((a)==(b)) //相等
#define LT(a,b) ((a)< (b)) //小与
#define LQ(a,b) ((a)<= (b)) //小与等于
//>>>>>>>>>>>>>>>>>>>>>自定义数据类型<<<<<<<<<<<<<<<<<<<<<<<<<<<
typedef int Status; //状态标志
typedef int KeyType; //关键字类型
typedef struct{
//关键字
KeyType key;
}TElemType;
//----------------二叉树的二叉链表存储表示--------------------
typedef struct BiNode{
//数据域
TElemType data;
//左右孩子结点指针
struct BiNode *lchild, *rchild;
}BiNode, *BiTree;
//-----------------------二叉排序树的主要操作---------------------------
//>>>>>>>>>>>>>>>>>>>>> 1.二叉排序树的构建 <<<<<<<<<<<<<<<<<<<<<<<<<<<
/*
函数:CreateBST
参数:BiTree &T 二叉排序树引用
返回值:状态码,操作成功返回OK
作用:根据用户输入创建一棵二叉排序树
*/
Status CreateBST(BiTree &T){
//二叉排序树插入结点函数声明
Status InsertBST(BiTree &T, TElemType e);
//二叉排序树顶点总数
int num;
//保存输入的关键字
TElemType e;
//确定树中的顶点总数
printf("您想创建一棵含有几个顶点的二叉排序树,请输入顶点数,并按回车确认:");
scanf("%d", &num);
//输入关键字
printf("请输入%d个整数作为关键字,中间用空格隔开,并按Enter确认\n", num);
for(int i = 0; i < num; i++) {
scanf("%d", &e.key);
InsertBST(T, e);
}//for
//操作成功
printf("二叉排序树创建完成\n");
return OK;
}//CreateBST
//>>>>>>>>>>>>>>>>>>> 2.二叉排序树的遍历 <<<<<<<<<<<<<<<<<<<<
/*
函数:PrintElement
参数:BiTree &T 二叉排序树引用
返回值:状态码,操作成功返回OK
作用:元素访问函数,输出关键字key
*/
Status PrintElement(KeyType key) {
//以控制台打印key的方式访问关键字
printf(" %d ", key);
//操作成功
return OK;
}//PrintElement
/*
函数:InOrderTraverse
参数:BiTree T 二叉排序树T
Status(* Visit)(KeyType) 元素访问函数