zoukankan      html  css  js  c++  java
  • 04-树7 二叉搜索树的操作集

      二叉搜索树的基本操作。

      其中Delete操作时有多种情况,需要严谨考虑。

    #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){
            BST = (BinTree)malloc(sizeof(struct TNode));
            BST->Data = X;
            BST->Left = NULL;
            BST->Right = NULL;        
        }
        if(X > BST->Data)
            BST->Right = Insert(BST->Right, X);
        if(X < BST->Data)
            BST->Left = Insert(BST->Left, X);
        return BST;
    }
    
    BinTree Delete( BinTree BST, ElementType X )
    {
        Position Tmp;
        if(!BST)
            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){  //要删除的结点有左右子树
                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)
            return NULL;
        if(X > BST->Data)
            return Find(BST->Right, X);
        else if(X < BST->Data)
            return Find(BST->Left, X);
        else 
            return BST;
    }
    
    Position FindMin( BinTree BST )
    {
        if(!BST)
            return NULL;
        else if(!BST->Left)
            return BST;
        else
            return FindMin(BST->Left);
    }
    
    Position FindMax( BinTree BST )
    {
        if(BST){
            while(BST->Right)
                BST = BST->Right;
        }
        return BST;
    }
  • 相关阅读:
    如何查看Linux进程详情?(ps命令)
    6款免费网络延迟测试工具
    Java中的JVM和Redis,你了解的透彻么?
    thinkPHP 5/thinkPHP 5.1 的apache重写文件
    redisclient客户端管理工具
    鼠标经过时切换图片
    点击页面元素页面向上滚动
    MongoDB客户端管理工具--MongoDB Compass
    JS继承
    JavaScript面向对象基础
  • 原文地址:https://www.cnblogs.com/biankun/p/8696006.html
Copyright © 2011-2022 走看看