04-树7 二叉搜索树的操作集 中国大学MOOC-陈越、何钦铭-数据结构-2020夏

题目: https://pintia.cn/problem-sets/1268384564738605056/problems/1276814005115539459
题解: https://blog.csdn.net/Dilly__dally/article/details/82025393
代码:

#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("
");
    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
", X);
        else {
            printf("%d is found
", Tmp->Data);
            if (Tmp == MinP) printf("%d is the smallest key
", Tmp->Data);
            if (Tmp == MaxP) printf("%d is the largest key
", Tmp->Data);
        }
    }
    scanf("%d", &N);
    for (i = 0; i < N; i++) {
        scanf("%d", &X);
        BST = Delete(BST, X);
    }
    printf("Inorder:"); InorderTraversal(BST); printf("
");

    return 0;
}
/* 你的代码将被嵌在这里 */
BinTree Insert(BinTree BST, ElementType X)
{
    if (BST == NULL) {
        BST = (BinTree)malloc(sizeof(BinTree));
        BST->Data = X;
        BST->Left = BST->Right = NULL;
    }
    else
    {
        if (BST->Data > X)
        {
            BST->Left = Insert(BST->Left, X);
        }
        else if (BST->Data < X)
        {
            BST->Right = Insert(BST->Right, X);
        }
    }
    return BST;
}
BinTree Delete(BinTree BST, ElementType X) {

    if (BST == NULL) {
        printf("Not Found
");
    }
    else {
        if (X > BST->Data)
            BST->Right = Delete(BST->Right, X);
        else if (X < BST->Data)
            BST->Left = Delete(BST->Left, X);
        else {
            if (BST->Left && BST->Right) {
                Position tmp = FindMin(BST->Right);
                BST->Data = tmp->Data;
                BST->Right = Delete(BST->Right, BST->Data);
            }
            else {
                Position tmp = BST;
                if (BST->Left)
                    BST = BST->Left;
                else
                    BST = BST->Right;
                free(tmp);
            }
        }
    }
    return BST;
}
Position Find(BinTree BST, ElementType X)
{
    if (BST)
    {
        if (X == BST->Data)return BST;
        else if (X > BST->Data)return Find(BST->Right, X);
        else return Find(BST->Left, X);
    }
    return BST;
}
Position FindMin(BinTree BST)
{
    if (BST == NULL)return BST;
    if (BST->Left)FindMin(BST->Left);
    else return BST;
}
Position FindMax(BinTree BST)
{
    if (BST == NULL)return BST;
    if (BST->Right)FindMax(BST->Right);
    else return BST;
}
原文地址:https://www.cnblogs.com/simon-chou/p/13619777.html