二叉搜索树的操作题集
来源:互联网 发布:linux关闭tomcat报错 编辑:程序博客网 时间:2024/05/17 12:48
6-17 二叉搜索树的操作集(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;}/* 你的代码将被嵌在这里 */
输入样例:
105 8 6 2 4 1 0 10 9 756 3 10 0 555 7 0 10 3
输出样例:
Preorder: 5 2 1 0 4 8 6 7 10 96 is found3 is not found10 is found10 is the largest key0 is found0 is the smallest key5 is foundNot FoundInorder: 1 2 4 6 8 9
代码:
BinTree Insert( BinTree BST, ElementType X ){if(BST==NULL){BinTree gg=(BinTree)malloc(sizeof(struct TNode));gg->Data=X;gg->Left=NULL;gg->Right=NULL;BST=gg;return BST;}else{BinTree hh=BST,parent;int flag;while(hh!=NULL){parent=hh;if(X>hh->Data)hh=hh->Right,flag=1;elsehh=hh->Left,flag=0;}BinTree tmp=(BinTree)malloc(sizeof(struct TNode));tmp->Data=X;tmp->Left=NULL;tmp->Right=NULL;hh=tmp;if(flag)parent->Right=hh;else parent->Left=hh;return BST;}}Position Find( BinTree BST, ElementType X ){if(BST){while(BST){if(X==BST->Data)return BST;else if(X>BST->Data)BST=BST->Right;else if(X<BST->Data)BST=BST->Left;}} return BST;}Position FindMin( BinTree BST )//找到搜索二叉树中最小值 {BinTree gg=NULL;if(BST){while(BST)gg=BST,BST=BST->Left;}return gg;}Position FindMax( BinTree BST )//找到搜索二叉树最大值 {BinTree gg=NULL;if(BST){while(BST)gg=BST,BST=BST->Right;}return gg;}BinTree Delete( BinTree BST, ElementType X ){//删除处理的关键在于 删除这个节点//之后还要就是将后面是节点给补上去 Position tmp; if(!BST){printf("Not Found\n");return BST; }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 {if(!BST->Left)BST=BST->Right;else if(!BST->Right)BST=BST->Left;}} return BST; }
//非递归
//建立二叉树BinTree Insert( BinTree BST, ElementType X ){if(BST==NULL){BinTree gg=(BinTree)malloc(sizeof(struct TNode));gg->Data=X;gg->Left=NULL;gg->Right=NULL;BST=gg;return BST;}else{BinTree hh=BST,parent;int flag;while(hh!=NULL){parent=hh;if(X>hh->Data)hh=hh->Right,flag=1;elsehh=hh->Left,flag=0;}BinTree tmp=(BinTree)malloc(sizeof(struct TNode));tmp->Data=X;tmp->Left=NULL;tmp->Right=NULL;hh=tmp;if(flag)parent->Right=hh;else parent->Left=hh;return BST;}}//递归BinTree Insert( BinTree BST, ElementType X ){if(BST==NULL){BinTree gg=(BinTree)malloc(sizeof(struct TNode));gg->Data=X;gg->Left=NULL;gg->Right=NULL;BST=gg;}else if(X>BST->Data) BST->Right=Insert(BST->Right, X);else if(X<BST->Data) BST->Left=Insert( BST->Left, X ); return BST;}
//找到这个节点的值
//递归 Position Find( BinTree BST, ElementType X ){if(BST){if(X==BST->Data)return BST;if(X>BST->Data)Find(BST->Right,X);else if(X<BST->Data)Find(BST->Left,X);} }//非递归Position Find( BinTree BST, ElementType X ){if(BST){while(BST){if(X==BST->Data)return BST;else if(X>BST->Data)BST=BST->Right;else if(X<BST->Data)BST=BST->Left;}} return BST;}
删除:
//删除BinTree Delete( BinTree BST, ElementType X ){//删除处理的关键在于 删除这个节点//之后还要就是将后面是节点给补上去 Position tmp; if(!BST){printf("Not Found\n");return BST; }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 {if(!BST->Left)BST=BST->Right;else if(!BST->Right)BST=BST->Left;}} return BST; }
找最大值最小值
Position FindMin( BinTree BST )//找到搜索二叉树中最小值 {BinTree gg=NULL;if(BST){while(BST)gg=BST,BST=BST->Left;}return gg;}Position FindMax( BinTree BST )//找到搜索二叉树最大值 {BinTree gg=NULL;if(BST){while(BST)gg=BST,BST=BST->Right;}return gg;}
阅读全文
0 0
- 二叉搜索树的操作题集
- 二叉搜索树的操作集
- 二叉搜索树的操作集
- 二叉搜索树的操作集
- 二叉搜索树的操作集
- 二叉搜索树的操作集
- 二叉搜索树的操作集
- 二叉搜索树的操作集
- 搜索二叉树的操作
- 二叉搜索树的操作
- 二叉搜索树的操作
- 二叉搜索树的操作
- 二叉搜索树操作集
- 【二叉搜索树】二叉搜索树的基本操作
- 二叉搜索树操作
- 04-树7 二叉搜索树的操作集
- 04-树7 二叉搜索树的操作集
- 04-树7 二叉搜索树的操作集
- pcl点云中pcd格式点云定义详解
- 查找(时间复杂度; 二分法)
- Redis雪崩、穿透、热点key等优化
- Android 全局捕获异常
- Java笔试知识点一
- 二叉搜索树的操作题集
- react 中render与return 之间的变量(画红的问题)
- 基于概率论的分类方法:朴素贝叶斯
- python读写文件
- 《从零开始写Javaweb框架》知识点--dispatcherServlet
- 并发编程(12)-Master-Worker
- M2 | JDBC—jdbc查询:select * from 表名
- C++中的cin函数和异常的来源(failbit)与处理(clear)
- 兼容IE老版本的动态增加例子