大话数据结构——二叉排序树的查找与插入操作~2020.8.12

话不多说,先放出完整的代码运行结果,再逐一讲解。
完整代码如下:

#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);
}

以上,就是有关二叉排序树查找操作的全部内容,之后将为您带来二叉排序树的删除操作,敬请期待~。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值