二叉排序树

#ifndef _BST_H_
#define _BST_H_

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW_s -2
typedef int Status;
typedef int TElemType;
typedef struct BiTNode
{
 TElemType data;
 struct  BiTNode *lchild, *rchild;
} BiTNode, *BiTree;

BiTree  CreatBST(BiTree &T);
Status DestroyBST(BiTree &T);
BiTree SearchBST(BiTree T, TElemType key);
Status SearchBST(BiTree T, TElemType key, BiTree f, BiTree &p);
Status InsertBST(BiTree &T, TElemType e);
Status DeleteBST(BiTree &T, TElemType key);
Status Delete(BiTree &p);
void InOrderTraverse(BiTree T);
#endif


#include"BST.h"
#include<iostream>
using namespace std;

/*//建立二叉排序树算法1
BiTree CreatBST(BiTree &T)
{
 TElemType key;
 int i,n;
 T = NULL;
 cout << "请输入节点总数:" << endl;
 cin>>n;

 for (i = 1; i <= n;i++)
 {
  cin >> key;
  InsertBST(T, key);
  
  //InOrderTraverse(T);
 }
 return T;
}
*/
//建立二叉排序树算法2
BiTree CreatBST(BiTree &T)
{
 TElemType key;
 int i;
 T = NULL;
 cin >> key;

 while (key != -1)//-1未输入结束标志
 {
  InsertBST(T, key);
  cin >> key;
 }
 return T;
}
//销毁二叉树
Status DestroyBST(BiTree &T)
{
 if (T)
 {
  DestroyBST(T->lchild);
  DestroyBST(T->rchild);
  T = NULL;
 }
 return OK;
}
//二叉排序树的查找
BiTree SearchBST(BiTree T, TElemType key)
{
 if ((!T)||(T->data==key))
 {
  return T;
 }
 else
 {
  if (T->data > key)
  {
   return SearchBST(T->lchild, key);
  }
  else
  {
   return SearchBST(T->rchild, key);
  }
 }
}

//插入二叉排序树
Status InsertBST(BiTree &T, TElemType key)
{
 BiTree p, s;
 if (!SearchBST(T, key, NULL, p))
 {
  s = (BiTree)malloc(sizeof(BiTNode));
  s->data = key;
  s->lchild = s->rchild = NULL;
  if (!p)
  {
   T = s;
  }
  else if (p->data >  key)
  {
   p->lchild = s;
  }
  else
  {
   p->rchild = s;
  }
  return TRUE;
 }
 else

 {
  return FALSE;
 }
}

//删除二叉排序树
Status DeleteBST(BiTree &T, TElemType key)
{
 if (!T)
 {
  return FALSE;
 }
 else
 {
  if (T->data == key)
  {
   Delete(T);
   return OK;
  }
  else if (T->data > key)
  {
   DeleteBST(T->lchild, key);
  }
  else
  {
   DeleteBST(T->rchild, key);
  }
 }
}

//删除节点
Status Delete(BiTree &p)
{
 BiTree q, s;
 if (!p->rchild)
 {
  q = p;
  p = p->lchild;
  free(q);
 }
 else if (!p->lchild)
 {
  q = p;
  p = p->rchild;
  free(q);
 }
 else
 {
  q = p;
  s = p->lchild;
  while (s->rchild)
  {
   q = s;
   s = s->rchild;
  }
  p->data = s->data;
  if (q != p)
  {
   q->rchild = s->lchild;
  }
  else
  {
   q->lchild = s->lchild;
   delete s;
  }
 }
 return TRUE;
}
//中序遍历
void InOrderTraverse(BiTree T)
{
 if (T)
 {
  InOrderTraverse(T->lchild);
  cout << T->data << " ";
  InOrderTraverse(T->rchild);
 }
}

// 查找(插入的辅助使用)
Status SearchBST(BiTree T, TElemType key, BiTree f, BiTree &p)
{
 if (!T)// 查找不成功
 {
  p = f;
  return FALSE;
 }

 else  if (key == T->data)  // 查找成功
 {
  p = T;
  return TRUE;
 }

 else if (key < T->data)   // 在左子树中继续查找
 {
  if (SearchBST(T->lchild, key, T, p) == TRUE)
   return TRUE;
  else
   return FALSE;
 }
 else        // 在右子树中继续查找
 {
  if (SearchBST(T->rchild, key, T, p) == TRUE)
   return TRUE;
  else
   return FALSE;
 }
}


#include"BST.h"
#include<iostream>
using namespace std;
int main()
{
 BiTree T;
 int select,n;
 TElemType key;
 CreatBST(T);
 do
 {
  cout << "1.查找二叉排序树!" << endl;
  cout << "2.插入二叉排序树" << endl;
  cout << "3.删除二叉排序树!" << endl;
  cout << "4.中序遍历!" << endl;
  cout << "0.操作结束!" << endl;
  cout << "请选择:" << endl;
  cin >> select;
  switch (select)
  {
  case 1:
   cout << "请输入值:" << endl;
   cin >> key;
   if (!SearchBST(T, key))
   {
    cout << "未找到!" << endl;
   }
   else
   {
    cout << "找到了!" << endl;
   }
   break;
  case 2:
   cout << "请输入要插入的值:" << endl;
   cin >> key;
   if (InsertBST(T, key) == TRUE)
   {
    cout << "插入成功!" << endl;
    InOrderTraverse(T);
    cout << endl;
   }
   else
   {
    cout << "插入失败!" << endl;
   }
   break;
  case 3:
   cout << "请输入要删除的值:" << endl;
   cin >> key;
   if (DeleteBST(T,key) == TRUE)
   {
    cout << "删除成功!" << endl;
   }
   else
   {
    cout << "二叉排序树中无该值!" << endl;
   }
   break;
  case 4:
   InOrderTraverse(T);
   cout << endl;
   break;
  default:
   cout << "输入错误!" << endl;
  }
 }while (select != 0);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值