本题要求实现给定二叉搜索树的5种常用操作。

函数接口定义:

BinTree Insert( BinTree BST, ElementType X );
BinTree Delete( BinTree BST, ElementType X );
Position Find( BinTree BST, ElementType X );
Position FindMin( BinTree BST );
Position FindMax( BinTree BST );

其中BinTree结构定义如下:

typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{ElementType Data;BinTree Left;BinTree Right;
};
  • 函数InsertX插入二叉搜索树BST并返回结果树的根结点指针;
  • 函数DeleteX从二叉搜索树BST中删除,并返回结果树的根结点指针;如果X不在树中,则打印一行Not Found并返回原树的根结点指针;
  • 函数Find在二叉搜索树BST中找到X,返回该结点的指针;如果找不到则返回空指针;
  • 函数FindMin返回二叉搜索树BST中最小元结点的指针;
  • 函数FindMax返回二叉搜索树BST中最大元结点的指针。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>typedef int ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{ElementType Data;BinTree Left;BinTree Right;
};void PreorderTraversal( BinTree BT ); /* 先序遍历,由裁判实现,细节不表 */
void InorderTraversal( BinTree BT );  /* 中序遍历,由裁判实现,细节不表 */BinTree Insert( BinTree BST, ElementType X );
BinTree Delete( BinTree BST, ElementType X );
Position Find( BinTree BST, ElementType X );
Position FindMin( BinTree BST );
Position FindMax( BinTree BST );int main()
{BinTree BST, MinP, MaxP, Tmp;ElementType X;int N, i;BST = NULL;scanf("%d", &N);for ( i=0; i<N; i++ ) {scanf("%d", &X);BST = Insert(BST, X);}printf("Preorder:"); PreorderTraversal(BST); printf("\n");MinP = FindMin(BST);MaxP = FindMax(BST);scanf("%d", &N);for( i=0; i<N; i++ ) {scanf("%d", &X);Tmp = Find(BST, X);if (Tmp == NULL) printf("%d is not found\n", X);else {printf("%d is found\n", Tmp->Data);if (Tmp==MinP) printf("%d is the smallest key\n", Tmp->Data);if (Tmp==MaxP) printf("%d is the largest key\n", Tmp->Data);}}scanf("%d", &N);for( i=0; i<N; i++ ) {scanf("%d", &X);BST = Delete(BST, X);}printf("Inorder:"); InorderTraversal(BST); printf("\n");return 0;
}
/* 你的代码将被嵌在这里 */

输入样例:

10
5 8 6 2 4 1 0 10 9 7
5
6 3 10 0 5
5
5 7 0 10 3

输出样例:

Preorder: 5 2 1 0 4 8 6 7 10 9
6 is found
3 is not found
10 is found
10 is the largest key
0 is found
0 is the smallest key
5 is found
Not Found
Inorder: 1 2 4 6 8 9
//插入
BinTree Insert( BinTree BST, ElementType X ){if(BST==NULL) {          /* 若原树为空,生成并返回一个结点的二叉搜索树 */BST = (BinTree)malloc(sizeof(BinTree));BST ->Data = X;BST ->Left = BST ->Right = NULL;}else {         /* 开始寻找要插入元素的位置 */if(X < BST ->Data ) {BST ->Left = Insert(BST ->Left, X);}else if(X > BST ->Data ) {BST ->Right = Insert(BST ->Right, X);}/* X已经存在,不用操作 */}return BST;
}
//删除
BinTree Delete( BinTree BST, ElementType X ){BinTree Tmp;if(BST==NULL)    printf("Not Found\n");else {if( X < BST->Data)  BST ->Left = Delete(BST->Left, X);          /* 左子树递归删除 */else if(X > BST->Data ) BST ->Right = Delete(BST->Right , X);       /* 右子树递归删除*/else {                                          /* 找到需要删除的结点 */if(BST->Left && BST->Right) {               /* 被删除的结点有左右子结点 */Tmp=FindMin(BST->Right);                /* 在右子树中找到最小结点填充删除结点 */BST->Data = Tmp ->Data;BST->Right=Delete(BST->Right,BST->Data);/* 递归删除要删除结点的右子树中最小元素 */}else {                                     /* 被删除结点有一个或没有子结点*/Tmp = BST;if(!BST->Left) BST = BST->Right;        /*有右孩子或者没孩子*/ else if(!BST->Right)    BST = BST->Left;/*有左孩子,一定要加else,不然BST可能是NULL,会段错误*/ free(Tmp);                              /*如无左右孩子直接删除*/}}}return BST;
}
//查找
Position Find( BinTree BST, ElementType X ){if(BST==NULL)    return NULL;if(BST->Data==X)    return BST; if(X>BST->Data)     return Find(BST->Right,X);      if(X<BST->Data)     return Find(BST->Left,X);/*  以下几种写法均可,推荐第上面这一种 if(!BST)    return NULL;if(BST->Data==X)    return BST; if(X>BST->Data)     Find(BST->Right,X);     if(X<BST->Data)     Find(BST->Left,X);if(BST){if(BST->Data==X)    return BST; if(X>BST->Data)     Find(BST->Right,X);     //如果不写return,则返回过来的值并没有继续返回给最开始的函数 if(X<BST->Data)     Find(BST->Left,X);} else return NULL;   if(BST){if(BST->Data==X)    return BST; if(X>BST->Data)     return  Find(BST->Right,X); if(X<BST->Data)     return  Find(BST->Left,X);} return NULL;if(BST){if(BST->Data==X)    return BST; if(X>BST->Data)     return Find(BST->Right,X);      if(X<BST->Data)     return Find(BST->Left,X);} else return NULL;*/
}
/*如果return NULL前面不写else且Find前也不写else,则最后递归返回的也没return,最后只能是执行到了return NULL
返回了,而如果find 前加上了return则就把递归的结果利用起来了,最后加不加else也无所谓了,而如果直接最后else,
不加return find也是可以的,加上了else之后就不会被每一次返回时最后的return NULL给覆盖掉,所以也行。 */
Position FindMin( BinTree BST ){if(BST){while(BST->Left){BST=BST->Left;}} return BST;
}
Position FindMax( BinTree BST ){if(BST){while(BST->Right){BST=BST->Right;}} return BST;
}

6-12 二叉搜索树的操作集 (30 分)相关推荐

  1. 6-12 二叉搜索树的操作集

    6-12 二叉搜索树的操作集(30 分) 本题要求实现给定二叉搜索树的5种常用操作. 函数接口定义: BinTree Insert( BinTree BST, ElementType X ); Bin ...

  2. 6-1 二叉搜索树的操作集 (30 分)

    大一下半期数据结构 二叉搜索树的操作集 本题要求实现给定二叉搜索树的5种常用操作. 函数接口定义: BinTree Insert( BinTree BST, ElementType X ); BinT ...

  3. 04-树7 二叉搜索树的操作集(c语言实现)

    题目 本题要求实现给定二叉搜索树的5种常用操作. 函数接口定义: BinTree Insert( BinTree BST, ElementType X ); BinTree Delete( BinTr ...

  4. 04-树7 二叉搜索树的操作集 (30 分)

    本题要求实现给定二叉搜索树的5种常用操作. 函数接口定义: BinTree Insert( BinTree BST, ElementType X ); BinTree Delete( BinTree ...

  5. 算法 树7 二叉搜索树的操作集

    全部每周作业和视频思考题答案和解析 见 浙江大学 数据结构 思考题+每周练习答案汇总 题目:本题要求实现给定二叉搜索树的5种常用操作. 函数接口定义: BinTree Insert( BinTree ...

  6. 7-3 二叉搜索树的结构 (30 分)

    二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值:它的左.右子树也分别 ...

  7. 数据结构 - 从二叉搜索树说到AVL树(一)之二叉搜索树的操作与详解(Java)

    二叉搜索树(Binary Search Tree),简称BST,顾名思义,一颗可以用于搜索的二叉树.BST在数据结构中占有很重要的地位,一些高级树结构都是其的变种,例如AVL树.红黑树等,因此理解BS ...

  8. 算法导论笔记:12二叉搜索树

    1:概念 二叉搜索树也叫二叉排序树,它支持的操作有:SEARCH, MINIMUM, MAXIMUM, PREDECESSOR, SUCCESSOR, INSERT, DELETE.所以,一颗二叉搜索 ...

  9. 二叉搜索树及其操作详解

    文章目录 二叉搜索树的定义 二叉搜索树的结构特点 二叉搜索树查询 查找 最大关键字元素和最小关键字元素 后继和前驱 二叉搜索树插入和删除 插入 删除 参考<算法导论(第三版)>第 12 章 ...

最新文章

  1. 学会 IDEA REST Client后,postman就可以丢掉了...
  2. PowerShell 学习笔记——运行命令
  3. JS浮点数运算Bug的解决办法(转自百度文库)
  4. ASP.NET MVC SSO单点登录设计与实现
  5. 前端学习(742):arguments使用
  6. 如何使得客户端和服务器端完美配合做IOS应用内付费
  7. vscode用作markdown入门1--环境创建
  8. 图示Windows Server2008 Feature Components
  9. golang 两个一样的字符串不相等_分享一个姑娘双眼皮术后两个眼睛有点不一样,不知道该不该修复?...
  10. https配置的后序以及网页定位的测试
  11. sudo apt-get 与 yum
  12. 优先级调度算法和高响应比优先调度算法
  13. plsql导出表结构到excel_PLSQL怎样导出oracle表结构和数据
  14. 微信小程序上线审核流程
  15. ElementUI Select选择器下拉框样式修改
  16. 威富通 全付通 中信 支付 PHP 一些问题总结(签名机制,sign:This field is required,no start line ,回调机制,漏单)
  17. 【计算机网络】透明网桥:逆向学习算法逐步建立转发表(例题详细解析)
  18. 【开源代码】-基于国民N32G45x系列MCU使用JLINK的RTT Viewer/logger/Client组件工具
  19. 【原创】新韭菜日记20---在国内股市亏钱的最大原因就是杠杆和割肉
  20. 使用wifi网卡笔记1----网卡选型、开发环境搭建、内核配置

热门文章

  1. 联想突围:老外主守、本土主攻
  2. 联想天逸 510S 2022怎么样
  3. 分析中国古建筑最大的特点
  4. WordPress如何设置先登录再进入主页
  5. redis的高级教程
  6. 将爬取的实习僧网站数据传入HDFS
  7. 电池续航时间增10倍
  8. ISFP——思想起决定作用
  9. 突破微信服务号群发限制
  10. Linus Torvalds 通过了 Linux 中避免 master/slave 等术语的提案