【Data_Structure笔记11】查找算法之【二叉排序树】

/*********************************************************************************************************************************
文件说明:
        【基于树的查找】之【二叉排序树】
详细说明:
        【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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值