zoukankan      html  css  js  c++  java
  • 04-树7 二叉搜索树的操作集 (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("
    ");
        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;
    }
    /* 你的代码将被嵌在这里 */

    输入样例:

    10
    5 8 6 2 4 1 0 10 9 7
    5
    6 3 10 0 5
    5
    5 7 0 10 3

    输出样例:

    Preorder: 5 2 1 0 4 8 6 7 10 9
    6 is found
    3 is not found
    10 is found
    10 is the largest key
    0 is found
    0 is the smallest key
    5 is found
    Not Found
    Inorder: 1 2 4 6 8 9

    提交测试代码:

    BinTree Insert(BinTree BST, ElementType X) {
        if (!BST) {
            BST = (BinTree)malloc(sizeof(struct TNode));
            BST->Data = X;
            BST->Left = NULL;
            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) {
            printf("Not Found
    ");
        }
        else if (BST->Data > X) {
            BST->Left = Delete(BST->Left, X);
        }
        else if (BST->Data < X) {
            BST->Right = Delete(BST->Right, X);
        }
        else if (BST->Left != NULL && BST->Right == NULL) {
            BinTree tmp = BST;
            BST = BST->Left;
            free(tmp);
        }
        else if (BST->Left == NULL && BST->Right != NULL) {
            BinTree tmp = BST;
            BST = BST->Right;
            free(tmp);
        }
        else if (BST->Left == NULL && BST->Right == NULL) {
            free(BST);
            BST = NULL;
        }
        else {
            Position tmp = FindMin(BST->Right);
            BST->Data = tmp->Data;
            BST->Right = Delete(BST->Right, BST->Data);
        }
        return BST;
    }
    
    Position Find(BinTree BST, ElementType X) {
        if (!BST) {
            return NULL;
        }
        else if (BST->Data > X) {
            return Find(BST->Left, X);
        }
        else if (BST->Data < X) {
            return Find(BST->Right, X);
        }
        else {
            return BST;
        }
    }
    
    Position FindMin(BinTree BST)
    {
        if (!BST)
        {
            return NULL;
        }
        else if (BST->Left != NULL) {
            return FindMin(BST->Left);
        }
        else {
            return BST;
        }
    }
    
    Position FindMax(BinTree BST)
    {
        if (!BST) {
            return NULL;
        }
        else if (BST->Right != NULL) {
            return FindMax(BST->Right);
        }
        else {
            return 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("
    ");
        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;
    }
    
    void PreorderTraversal(BinTree T){
        if (!T) {
            return;
        }
        printf(" %d", T->Data);
        if(T->Left){
            PreorderTraversal(T->Left);
        }
        if (T->Right){
            PreorderTraversal(T->Right);
        }
    }
    
    void InorderTraversal(BinTree T)
    {
        if (!T) {
            return;
        }
        if (T->Left) {
            InorderTraversal(T->Left);
        }
        printf(" %d", T->Data);
        if (T->Right) {
            InorderTraversal(T->Right);
        }
    }
    
    BinTree Insert(BinTree BST, ElementType X) {
        if (!BST) {
            BST = (BinTree)malloc(sizeof(struct TNode));
            BST->Data = X;
            BST->Left = NULL;
            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) {
            printf("Not Found
    ");
        }
        else if (BST->Data > X) {
            BST->Left = Delete(BST->Left, X);
        }
        else if (BST->Data < X) {
            BST->Right = Delete(BST->Right, X);
        }
        else if (BST->Left != NULL && BST->Right == NULL) {
            BinTree tmp = BST;
            BST = BST->Left;
            free(tmp);
        }
        else if (BST->Left == NULL && BST->Right != NULL) {
            BinTree tmp = BST;
            BST = BST->Right;
            free(tmp);
        }
        else if (BST->Left == NULL && BST->Right == NULL) {
            free(BST);
            BST = NULL;
        }
        else {
            Position tmp = FindMin(BST->Right);
            BST->Data = tmp->Data;
            BST->Right = Delete(BST->Right, BST->Data);
        }
        return BST;
    }
    
    Position Find(BinTree BST, ElementType X) {
        if (!BST) {
            return NULL;
        }
        else if (BST->Data > X) {
            return Find(BST->Left, X);
        }
        else if (BST->Data < X) {
            return Find(BST->Right, X);
        }
        else {
            return BST;
        }
    }
    
    Position FindMin(BinTree BST)
    {
        if (!BST)
        {
            return NULL;
        }
        else if (BST->Left != NULL) {
            return FindMin(BST->Left);
        }
        else {
            return BST;
        }
    }
    
    Position FindMax(BinTree BST)
    {
        if (!BST) {
            return NULL;
        }
        else if (BST->Right != NULL) {
            return FindMax(BST->Right);
        }
        else {
            return BST;
        }
    }
  • 相关阅读:
    ButterKnife不同版本配置
    【转载】RecyclerView源码解析
    【转载】RecyclerView使用全解析
    RecyclerView 和 ListView 使用对比分析
    apk瘦身
    【转载】图片压缩最优方案
    file.listFiles()按文件大小、名称、日期排序方法
    git命令
    Android中由Handler和内部类引起的内存泄漏
    查看Android手机数据库
  • 原文地址:https://www.cnblogs.com/2018shawn/p/13419740.html
Copyright © 2011-2022 走看看