zoukankan      html  css  js  c++  java
  • 04-树7 二叉搜索树的操作集(30 point(s)) 【Tree】

    04-树7 二叉搜索树的操作集(30 point(s))

    本题要求实现给定二叉搜索树的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中最大元结点的指针。
    

    裁判测试程序样例:

    #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

    思路

    先序遍历 是 根 左 右
    中序遍历 是 左 根 右

    插入就是 如果目标比当前的结点大 就往右 递归 比当前结点小 往左递归
    碰到 NULL 就插入

    然后删除

    如果左右子树都存在

    那么就找右子树的最小结点来替代当前结点

    如果右子数不存在 直接把左子树接过来
    如果左子树不存在 直接把右子数接过来

    AC代码

    #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 BT )
    {
        if (BT == NULL)
            return;
        printf(" %d", BT->Data);
        PreorderTraversal( BT->Left);
        PreorderTraversal( BT->Right);
    }
    
    void InorderTraversal( BinTree BT )
    {
        if (BT == NULL)
            return;
        InorderTraversal( BT->Left );
        printf(" %d", BT->Data);
        InorderTraversal( BT->Right);
    }
    
    BinTree Insert( BinTree BST, ElementType X )
    {
        if (BST == NULL)
        {
            BST = (BinTree) malloc(sizeof(struct TNode));
            BST->Data = X;
            BST->Left = NULL;
            BST->Right = NULL;
        }
        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 == NULL)
            return NULL;
        else if (X == BST->Data)
            return BST;
        else if (X > BST->Data)
            return Find (BST->Right, X);
        else if (X < BST->Data)
            return Find (BST->Left, X);
    }
    
    Position FindMin( BinTree BST )
    {
        if (BST == NULL)
            return NULL;
        while (BST->Left != NULL)
            BST = BST->Left;
        return BST;
    }
    
    Position FindMax( BinTree BST )
    {
        if (BST == NULL)
            return NULL;
        while (BST->Right != NULL)
            BST = BST->Right;
        return BST;
    }
    
    BinTree Delete( BinTree BST, ElementType X )
    {
        BinTree temp;
        if (BST == NULL)
            printf("Not Found
    ");
        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)
                {
                    temp = FindMin(BST->Right);
                    BST->Data = temp->Data;
                    BST->Right = Delete(BST->Right, temp->Data);
                }
                else
                {
                    temp = BST;
                    if (BST->Left == NULL)
                        BST = BST->Right;
                    else if (BST->Right == NULL)
                        BST = BST->Left;
                    free(temp);
                }
            }
        }
        return BST;
    }
    
  • 相关阅读:
    Lambda表达式、依赖倒置
    ASP.NET vNext 概述
    Uname
    RHEL4 i386下安装rdesktop【原创】
    Taxonomy of class loader problems encountered when using Jakarta Commons Logging(转)
    How to decompile class file in Java and Eclipse
    先有的资源,能看的速度看,不能看的,抽时间看。说不定那天就真的打不开了(转)
    Google App Engine 学习和实践
    【VBA研究】VBA通过HTTP协议实现邮件轨迹跟踪查询
    js正則表達式语法
  • 原文地址:https://www.cnblogs.com/Dup4/p/9433146.html
Copyright © 2011-2022 走看看