/*********************************************************************************************************************************
文件说明:
【基于树的查找】之【二叉排序树】
详细说明:
【1】基于树的查找是指在树形结构中查找某一个指定的数据。基于树的查找法又被称为树表查找法,能够将待查找表组成特定树形式,并且
能够在树结构上实现查找。
【2】基于树的查找法主要包括:【二叉排序树】【平衡二叉树】【B树】等
二叉排序树:
【1】【二叉排序树】又被称为【二叉查找树】。这是一种特殊结构的二叉树,在现实中通常被定义为一棵空树,或者被描述为具有如下性质
的二叉树:
【1】如果它的左子树非空,则左子树上所有结点的值均小于根节点的值
【2】如果它的左子树非空,则右子树上所有结点的值均大于根节点的值
【3】左右子树都是二叉排序树
【2】由此可见,对二叉排序树的定义可以用一个递归定义的过程来描述。
开发环境:
Win10+VS2012
时间地点:
陕西师范大学 文津楼 2017/8/29
作 者:
九 月
**********************************************************************************************************************************/
#include<iostream>
#define ARRAY_LENGTH 15
typedef int ElemType;
ElemType srcData[] = {10,9,8,7,1,5,54,20,6,70,12,37,92,28,65,83};
/*********************************************************************************************************************************
模块说明:
【1】二叉树的【链式存储结构】
【2】在【二叉排序树】的操作中,可以使用【二叉链表】作为【存储结构】,其结点结构如下所示:
【3】二叉链表结点结构体的定义
**********************************************************************************************************************************/
typedef struct BiTNode
{
ElemType keyData; //【1】二叉链表关键字的值
struct BiTNode* lChild; //【2】二叉链表结点的左指针
struct BiTNode* rChild; //【3】二叉链表结点的右指针
}BiTNode,*BiTree;
/*********************************************************************************************************************************
函数原型:
template<typename KeyType>void BiTreeInsert(BiTree& biTreeRoot,KeyType keyData)
函数说明:
【1】二叉排序树的插入操作
【2】基于【泛型编程】的【二叉排序树】的插入操作
**********************************************************************************************************************************/
template<typename KeyType>void BiTreeInsert(BiTree& biTreeRoot,KeyType keyData)
{
BiTNode* pInsertData = NULL;
BiTNode* pParent = NULL;
BiTNode* pHead = NULL;
pInsertData = (BiTNode*)std::malloc(sizeof(BiTNode)); //【1】为将要插入的数据在内存中开辟内存空间
if(!pInsertData)
{
std::cout<<"【NOTICE】申请内存出错,请检查程序!"<<std::endl;
std::system("pause");
std::exit(1);
}
pInsertData->keyData = keyData; //【2】保存结点的数据
pInsertData->lChild = NULL; //【3】左右子树置为空
pInsertData->rChild = NULL;
pHead = biTreeRoot; //【4】让pHead指向二叉排序树的根节点
//查找需要添加的父结点
while(pHead)
{
pParent = pHead;
if(keyData<pHead->keyData) //【1】若关键字小于结点的数据,则在左子树上查找
{
pHead = pHead->lChild;
}
else //【2】若关键字小大于结点的数据,则在右子树上查找
{
pHead = pHead->rChild;
}
}
//判断要插入的数据,是添加到二叉排序树的左子树还是右子树
if(keyData<pParent->keyData) //【3】小于父节点,添加到左子树
{
pParent->lChild = pInsertData;
}
else //【4】大于父节点,添加到右子树
{
pParent->rChild = pInsertData;
}
}
/*********************************************************************************************************************************
函数原型:
template<typename DataType>void CreatBiTree(BiTree& biTreeRoot,DataType srcData[],int iLength)
函数说明:
根据一个数组数据序列,构造一个二叉排序树
**********************************************************************************************************************************/
template<typename DataType>void CreatBiTree(BiTree& biTreeRoot,DataType srcData[],int iLength)
{
biTreeRoot->keyData = srcData[0]; //【1】将数组中的第一个值,作为二叉排序树根节点的值
biTreeRoot->lChild = NULL;
biTreeRoot->rChild = NULL;
for(int i=1;i<iLength;i++)
{
BiTreeInsert<DataType>(biTreeRoot,srcData[i]);
}
}
/*********************************************************************************************************************************
函数原型:
template<typename KeyType>void BiTreeInsert(BiTree& biTreeRoot,KeyType keyData)
函数说明:
对已经构建成功的二叉排序树进行【中序遍历】
**********************************************************************************************************************************/
void BST_InOrder(BiTree& biTreeRoot)
{
if(biTreeRoot)
{
BST_InOrder(biTreeRoot->lChild); //【1】中序遍历左子树
std::cout<<biTreeRoot->keyData<<" "; //【2】输出结点数据
BST_InOrder(biTreeRoot->rChild); //【3】中序遍历右子树
}
return;
}
/*********************************************************************************************************************************
模块说明:
控制台应用程序的入口点函数
**********************************************************************************************************************************/
int main(int argc,char* argv[])
{
std::cout<<"==========================================【原始数据】============================================="<<std::endl;
for(int i=0;i<ARRAY_LENGTH;i++)
{
std::cout<<srcData[i]<<" ";
}
std::cout<<std::endl;
BiTree pBSTRoot = NULL;
pBSTRoot = (BiTNode*)std::malloc(sizeof(BiTNode));
CreatBiTree<ElemType>(pBSTRoot,srcData,ARRAY_LENGTH);
std::cout<<"=======================================【中序遍历二叉排序树】============================================="<<std::endl;
BST_InOrder(pBSTRoot);
std::cout<<std::endl;
std::system("pause");
return 0;
}