04-树7 二叉搜索树的操作集
来源:互联网 发布:sql中删除重复数据 编辑:程序博客网 时间:2024/05/17 13:07
/*=====================================================================================# COPYRIGHT NOTICE# Copyright (c) 2016## @Author :Zehao Wang# @Email :zehaowang@163.com# @from :https://pta.patest.cn/pta/test/1342/exam/3/question/20490# @Last modified :2016-12-04# @Description :实现二叉搜索树的操作集========================================================================================*/#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;}/* 你的代码将被嵌在这里 */BinTree Insert(BinTree BST, int X){ if (!BST) { BST = (struct TNode*)malloc(sizeof(struct TNode)); BST->Data = X; BST->Left = NULL; BST->Right = NULL; } else { if (X < BST->Data) BST->Left=Insert(BST->Left, X); else BST->Right=Insert(BST->Right, X); } return BST;}void PreorderTraversal(BinTree BT){if(BT) { printf(" %d", BT->Data); PreorderTraversal(BT->Left); PreorderTraversal(BT->Right); }}Position FindMin(BinTree BST){ if (BST->Left == NULL) return BST; else { BST = BST->Left; FindMin(BST); }}Position FindMax(BinTree BST){ if (BST->Right == NULL) return BST; else { BST = BST->Right; FindMax(BST); }}Position Find(BinTree BST, ElementType X){ if (!BST) return NULL; else { if (BST->Data == X) return BST; else if (BST->Data > X) return Find(BST->Left, X); else return Find(BST->Right, X); }}BinTree Delete(BinTree BST, ElementType X){ Position BST1; 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) { BST1 = FindMin(BST->Right);//寻找右子树中的最小值(或左子树中的最大值) BST->Data = BST1->Data; BST->Right=Delete(BST->Right, BST1->Data); } //第二种情况,只有一个儿子或者没有儿子 else { BST1 = BST; if (!BST->Left)//只有一个右儿子或没儿子 { BST = BST->Right; } else if (!BST->Right) { BST = BST->Left; } free(BST1); } } } return BST;}void InorderTraversal(BinTree BT){ if (!BT) return; else { InorderTraversal(BT->Left); printf(" %d",BT->Data); InorderTraversal(BT->Right); }}/*============================================================================================注:此题很基础,难度不大。只需注意Delete的操作即可。详细分析可见《数据结构》陈越主编P122—P125页的讲解。==============================================================================================*/
0 0
- 04-树7 二叉搜索树的操作集
- 04-树7 二叉搜索树的操作集
- 04-树7 二叉搜索树的操作集
- 04-树7 二叉搜索树的操作集
- 二叉搜索树的基本操作-04-树7 二叉搜索树的操作集 (30分)
- 二叉搜索树的操作集
- 二叉搜索树的操作集
- 二叉搜索树的操作集
- 二叉搜索树的操作题集
- 二叉搜索树的操作集
- 二叉搜索树的操作集
- 二叉搜索树的操作集
- 二叉搜索树的操作集
- 搜索二叉树的操作
- 二叉搜索树的操作
- 二叉搜索树的操作
- 二叉搜索树的操作
- 04-树7 二叉搜索树的操作集 (30分)
- DBH
- 集合
- Angular2(八)--module化(核心模块与共享模块)
- nexus私服安装配置
- iOS开发之RunLoop-赵鹏举
- 04-树7 二叉搜索树的操作集
- 一个菜鸟的QT学习笔记(1)
- 【STM8L】STM8L之内部16M晶振
- Linux环境C语言编译与头文件等知识点小结
- 简单的通讯录——第一版
- 数据结构实验之查找七:线性之哈希表(线性探测解决哈希表的冲突)
- 完整的图片轮换-包括左右移动和缓动效果
- PHP关于数组的详细讲解及测试
- 懒人专用--用好SciTE的缩写功能