二叉搜索树的操作题集

来源:互联网 发布: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;};
  • 函数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;}/* 你的代码将被嵌在这里 */

输入样例:

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



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 肚子又胀又痛怎么办 1岁宝宝肚子胀气怎么办 2岁宝宝肚子胀气怎么办 产后腰粗肚子大怎么办 发烧后腹泻拉水怎么办 又吐又拉还发烧怎么办 喝中药恶心想吐怎么办 生完孩子肛门疼怎么办 拉完大便肛门痛怎么办 肚子总是凉凉的怎么办 京东金条风控了怎么办 京东维修没发票怎么办 假牙吞到肚子里怎么办 眼睛一只大一只小怎么办 一个眼睛大一个眼睛小怎么办 电脑上的字模糊怎么办 无忧乐行注销了怎么办 连供墨盒有空气怎么办 30岁突然停经了怎么办 下面很痒怎么办白带多 私处有点痒怎么办洗液 人的下体皮肤痒怎么办 打球手指关节肿了怎么办 婴儿2个月鼻塞怎么办 3个月婴儿鼻塞怎么办 2个月婴儿感冒了怎么办 头发剪短了很丑怎么办 头发剪了后悔了怎么办 额头的碎头发翘怎么办 带耳机时间长耳朵疼怎么办 种的睫毛容易掉怎么办 走路多了脚背疼怎么办 扭伤脚筋怎么办恢复快 脚背上的筋断了怎么办 腿上的筋疼怎么办 脚筋拉伤怎么办恢复快 手指的筋断了怎么办 皮和肌肉粘连了怎么办 手筋拉伤怎么办恢复快 突然手腕的筋痛怎么办 手筋拉伤肿了怎么办