04-树7 二叉搜索树的操作集
来源:互联网 发布:淘宝网手机客户端 编辑:程序博客网 时间:2024/06/07 01:22
本题要求实现给定二叉搜索树的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
中最大元结点的指针;
解:这5种操作集,前三个主要用递归的方法进行操作,后两种根据二叉树的特性,最小的数肯定在左子树的左叶子,最大的数肯定在右子树的右叶子。
整体的全部程序样式:
#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;}/* 你的代码将被嵌在这里 */void PreorderTraversal( BinTree BT ){ if (BT){ printf("%d ",BT->Data); PreorderTraversal(BT->Left); PreorderTraversal(BT->Right); }}void InorderTraversal( BinTree BT ){ if (BT){ InorderTraversal( BT->Left ); printf("%d ",BT->Data); InorderTraversal( BT->Right ); }}BinTree Insert( BinTree BST, ElementType X ){ if (BST==NULL){ BST=(struct TNode *)malloc(sizeof(struct TNode)); BST->Data=X; BST->Left=BST->Right=NULL; return BST; } if (X<BST->Data) BST->Left=Insert(BST->Left,X); if (X>BST->Data) BST->Right=Insert(BST->Right,X); return BST;}BinTree Delete( BinTree BST, ElementType X ){ Position Tmp; if(!BST) 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; free(Tmp); } } } return BST;}Position Find( BinTree BST, ElementType X ){ if (BST==NULL) return BST; if (X==BST->Data) return BST; if (X>BST->Data) return Find(BST->Right,X); if (X<BST->Data) return Find(BST->Left,X); else return BST;}Position FindMin( BinTree BST ){ if (BST){ while (BST->Left!=NULL){ BST=BST->Left; } } return BST;}Position FindMax( BinTree BST ){ if (BST){ while (BST->Right!=NULL){ BST=BST->Right; } } return BST;}
0 0
- 04-树7 二叉搜索树的操作集
- 04-树7 二叉搜索树的操作集
- 04-树7 二叉搜索树的操作集
- 04-树7 二叉搜索树的操作集
- 二叉搜索树的基本操作-04-树7 二叉搜索树的操作集 (30分)
- 二叉搜索树的操作集
- 二叉搜索树的操作集
- 二叉搜索树的操作集
- 二叉搜索树的操作题集
- 二叉搜索树的操作集
- 二叉搜索树的操作集
- 二叉搜索树的操作集
- 二叉搜索树的操作集
- 搜索二叉树的操作
- 二叉搜索树的操作
- 二叉搜索树的操作
- 二叉搜索树的操作
- 二叉搜索树操作集
- web学习第一节练习
- # linear regression & logistics regression学习笔记
- nginx 服务器重启命令,关闭
- 当良心受到一万点伤害时,你会选择利益还是良心
- 位运算
- 04-树7 二叉搜索树的操作集
- PHP基础(2)---PHP函数
- PAT 乙级 1027. 打印沙漏(20)
- LeetCode算法题——26. Remove Duplicates from Sorted Array
- 【C】c语言模拟实现strcopy函数和strlen函数!!
- 深入剖析java对象创建
- ubuntu安装Mysql的注意事项
- 实战Unity3d-001:界面介绍
- PHP数组转JSON函数json_encode和JSON转数组json_decode函数的使用方法