话不多说,先放出完整的代码与运行结果,再逐一讲解。
完整代码如下:
#include <iostream>
using namespace std;
typedef struct BiTNode{
int data;
BiTNode *lchild,*rchild;
}BiTNode,*BiTree;//使用typedef为BiTNode赋予两种不同的名字
bool SearchBST(BiTree T,int key,BiTree f,BiTree *p){
/*二叉排序树的查找操作,运用递归实现*/
/*T为二叉链表,key为要查找的值,f为查找路径上访问的最后一个结点,p为
指向二叉链表的指针,指向最终结果*/
if(T == NULL){
*p = f;
return false;
}/*T为空,查找失败,p指向查找路径上访问的最后一个结点并返回false*/
else if(key == T->data){
*p = T;
return true;
}
else if(key > T->data){
SearchBST(T->rchild,key,T,p);
}
else{
SearchBST(T->lchild,key,T,p);
}
}
bool InsertBST(BiTree *T,int key){
BiTree p,s;
if(!SearchBST(*T,key,NULL,&p)){
/*倘若查找不成功,即二叉排序树中查找不到key,执行插入操作,将key插入到
二叉排序树中*/
s=new BiTNode;
s->data = key;
s->lchild=s->rchild=NULL;
if(p == NULL){
*T = s;
}/*由于查找操作中,p的返回值为查找值或访问路径上的最后一个值,
若p为空指针,则代表二叉排序树尚未建立,此操作为:将s设立为二叉
排序树的新的根结点*/
else if(p->data>key){
p->lchild = s;
}
else{
p->rchild=s;
}
return true;
}
return false;
}
void InOrderTraverse(BiTree T){
if(T == NULL) return ;
InOrderTraverse(T->lchild);
cout<<T->data<<' ';
InOrderTraverse(T->rchild);
}
int main()
{
int a[] = {62,88,58,47,35,73,51,99,37,93};
int n;
n = 10;
BiTree T = NULL;
for(int i=0;i<n;i++){
InsertBST(&T,a[i]);
}
cout<<"遍历二叉排序树的结果为:";
InOrderTraverse(T);
cout<<endl;
BiTree p;
cout<<"执行二叉排序树的查找操作,查找58与100:"<<endl;
if(SearchBST(T,58,NULL,&p)){
cout<<p->data<<' '<<"查找成功;"<<endl;
}
else{
cout<<p->data<<"查找失败;"<<endl;
}
if(SearchBST(T,100,NULL,&p)){
cout<<p->data<<' '<<"查找成功;"<<endl;
}
else{
cout<<p->data<<' '<<"查找失败;"<<endl;
}
return 0;
}
运行结果:
Part1:二叉排序树的结构定义
这一部分自然不必多说,与之前树专题当中的二叉树结构定义如出一辙,此处便不再赘述。
typedef struct BiTNode{
int data;
BiTNode *lchild,*rchild;
}BiTNode,*BiTree;//使用typedef为BiTNode赋予两种不同的名字
Part2:二叉树的查找操作
理解这一部分的代码就非常关键了。此处并非先给出二叉排序树的构建函数,而是先给出了查找函数,原因是二叉树的构建过程中也用到了查找操作,因此此处先阐明查找的原理是十分重要的。
难点:理解实参与形参之间的关系,递归。
实参与形参:
注意,BiTree本身就是一个指向BiTNode的指针,由于使用了typedef道具,使得指针符号被隐藏了,此处需多加注意。另外,对于形参BiTree *p,是要好好理解的,BiTree有三重含义,可以代表一个二叉链表,也可以代表一个指向BiTNode的指针,亦可代表使用CPP中new工具构建出来的动态变量,而 *p一个指向BiTree的指针。此处用语言阐述不太容易理清思路,建议读者阅读代码,这样更简明。
递归:
此处的递归是最简单的递归,不必多多赘述,阅读代码便可很直观地理解。
bool SearchBST(BiTree T,int key,BiTree f,BiTree *p){
/*二叉排序树的查找操作,运用递归实现*/
/*T为二叉链表,key为要查找的值,f为查找路径上访问的最后一个结点,p为
指向二叉链表的指针,指向最终结果*/
if(T == NULL){
*p = f;
return false;
}/*T为空,查找失败,p指向查找路径上访问的最后一个结点并返回false*/
else if(key == T->data){
*p = T;
return true;
}
else if(key > T->data){
SearchBST(T->rchild,key,T,p);
}
else{
SearchBST(T->lchild,key,T,p);
}
}
Part3:二叉树的插入与构建操作
此处就调用了Part2中的查找操作,以查找要插入的值是否已经在树中,若不在,方可执行插入操作。
bool InsertBST(BiTree *T,int key){
BiTree p,s;
if(!SearchBST(*T,key,NULL,&p)){
/*倘若查找不成功,即二叉排序树中查找不到key,执行插入操作,将key插入到
二叉排序树中*/
s=new BiTNode;
s->data = key;
s->lchild=s->rchild=NULL;
if(p == NULL){
*T = s;
}/*由于查找操作中,p的返回值为查找值或访问路径上的最后一个值,
若p为空指针,则代表二叉排序树尚未建立,此操作为:将s设立为二叉
排序树的新的根结点*/
else if(p->data>key){
p->lchild = s;
}
else{
p->rchild=s;
}
return true;
}
return false;
}
Part4:编程的魅力~遍历二叉排序树
短短的几行代码,便将二叉排序树的升序结果呈现在了编程者的眼前,我想可能这就是编程序的魅力吧~。
运用到的是二叉树的中序遍历,可直接得到二叉排序树的升序遍历结果。
void InOrderTraverse(BiTree T){
if(T == NULL) return ;
InOrderTraverse(T->lchild);
cout<<T->data<<' ';
InOrderTraverse(T->rchild);
}
以上,就是有关二叉排序树查找操作的全部内容,之后将为您带来二叉排序树的删除操作,敬请期待~。