6-12 二叉搜索树的操作集 (30 分)
本题要求实现给定二叉搜索树的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;
};
- 函数
Insert
将X
插入二叉搜索树BST
并返回结果树的根结点指针; - 函数
Delete
将X
从二叉搜索树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 分)相关推荐
- 6-12 二叉搜索树的操作集
6-12 二叉搜索树的操作集(30 分) 本题要求实现给定二叉搜索树的5种常用操作. 函数接口定义: BinTree Insert( BinTree BST, ElementType X ); Bin ...
- 6-1 二叉搜索树的操作集 (30 分)
大一下半期数据结构 二叉搜索树的操作集 本题要求实现给定二叉搜索树的5种常用操作. 函数接口定义: BinTree Insert( BinTree BST, ElementType X ); BinT ...
- 04-树7 二叉搜索树的操作集(c语言实现)
题目 本题要求实现给定二叉搜索树的5种常用操作. 函数接口定义: BinTree Insert( BinTree BST, ElementType X ); BinTree Delete( BinTr ...
- 04-树7 二叉搜索树的操作集 (30 分)
本题要求实现给定二叉搜索树的5种常用操作. 函数接口定义: BinTree Insert( BinTree BST, ElementType X ); BinTree Delete( BinTree ...
- 算法 树7 二叉搜索树的操作集
全部每周作业和视频思考题答案和解析 见 浙江大学 数据结构 思考题+每周练习答案汇总 题目:本题要求实现给定二叉搜索树的5种常用操作. 函数接口定义: BinTree Insert( BinTree ...
- 7-3 二叉搜索树的结构 (30 分)
二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值:它的左.右子树也分别 ...
- 数据结构 - 从二叉搜索树说到AVL树(一)之二叉搜索树的操作与详解(Java)
二叉搜索树(Binary Search Tree),简称BST,顾名思义,一颗可以用于搜索的二叉树.BST在数据结构中占有很重要的地位,一些高级树结构都是其的变种,例如AVL树.红黑树等,因此理解BS ...
- 算法导论笔记:12二叉搜索树
1:概念 二叉搜索树也叫二叉排序树,它支持的操作有:SEARCH, MINIMUM, MAXIMUM, PREDECESSOR, SUCCESSOR, INSERT, DELETE.所以,一颗二叉搜索 ...
- 二叉搜索树及其操作详解
文章目录 二叉搜索树的定义 二叉搜索树的结构特点 二叉搜索树查询 查找 最大关键字元素和最小关键字元素 后继和前驱 二叉搜索树插入和删除 插入 删除 参考<算法导论(第三版)>第 12 章 ...
最新文章
- 学会 IDEA REST Client后,postman就可以丢掉了...
- PowerShell 学习笔记——运行命令
- JS浮点数运算Bug的解决办法(转自百度文库)
- ASP.NET MVC SSO单点登录设计与实现
- 前端学习(742):arguments使用
- 如何使得客户端和服务器端完美配合做IOS应用内付费
- vscode用作markdown入门1--环境创建
- 图示Windows Server2008 Feature Components
- golang 两个一样的字符串不相等_分享一个姑娘双眼皮术后两个眼睛有点不一样,不知道该不该修复?...
- https配置的后序以及网页定位的测试
- sudo apt-get 与 yum
- 优先级调度算法和高响应比优先调度算法
- plsql导出表结构到excel_PLSQL怎样导出oracle表结构和数据
- 微信小程序上线审核流程
- ElementUI Select选择器下拉框样式修改
- 威富通 全付通 中信 支付 PHP 一些问题总结(签名机制,sign:This field is required,no start line ,回调机制,漏单)
- 【计算机网络】透明网桥:逆向学习算法逐步建立转发表(例题详细解析)
- 【开源代码】-基于国民N32G45x系列MCU使用JLINK的RTT Viewer/logger/Client组件工具
- 【原创】新韭菜日记20---在国内股市亏钱的最大原因就是杠杆和割肉
- 使用wifi网卡笔记1----网卡选型、开发环境搭建、内核配置