二叉搜索樹


#include<bits/stdc++.h>
#define MaxSize 100
using namespace std;
typedef struct TreeNode
{//定義二叉樹結構
    char Data;
    struct Node *lchild,*rchild;
}*BiTree,BiTNode;

//查找1
BiTNode Find( int X, BiTree BST ) {
    if( !BST ) 
        return NULL; /*查找失敗*/ 
    if( X > BST->Data ) 
        return Find( X, BST->rchild ); /*在右子樹中繼續查找*/
    else if( X < BST->Data ) 
        return Find( X, BST->lchild ); /*在左子樹中繼續查找*/
    else /* X == BST->Data */ 
        return BST; /*查找成功,返回結點的找到結點的地址*/
}
//查找2(非遞歸)
BiTNode IterFind( int X, BiTree BST ) {
    while( BST ) { 
        if( X > BST->Data ) BST = BST->rchild; /*向右子樹中移動,繼續查找*/
        else if( X < BST->Data ) 
            BST = BST->lchild; /*向左子樹中移動,繼續查找*/
        else /* X == BST->Data */ 
            return BST; /*查找成功,返回結點的找到結點的地址*/
    } 
    return NULL; /*查找失敗*/ 
}

//查最小(遞歸)
BiTNode FindMin(BiTree BST){
    if(!BST)
        return NULL;
    else if(!BST->lchild)
        return BST;
    else
        return FindMin(BST->lchild);
}
//查最大(迭代)
BiTNode FindMax(BiTree BST){
    if(BST)
        while(BST->rchild)
            BST = BST->rchild;
    return BST;
}
//插入
BiTree Insert( int X, BiTree BST ) {
    if( !BST ){
        /*若原樹為空,生成並返回一個結點的二叉搜索樹*/
        BST = malloc(sizeof(struct TreeNode)); 
        BST->Data = X; 
        BST->lchild = BST->rchild = NULL;
    }else /*開始找要插入元素的位置*/ 
        if( X < BST->Data ) 
            BST->lchild = Insert( X, BST->lchild); 
        /*遞歸插入左子樹*/
        else if( X > BST->Data ) 
            BST->rchild = Insert( X, BST->rchild); /*遞歸插入右子樹*/
        /* else X已經存在,什么都不做 */ 
    return BST; 
}
//刪除
BiTree Delete( int X, BiTree BST ) {
    BiTNode Tmp; 
    if( !BST ) printf("要刪除的元素未找到"); 
    else if( X < BST->Data )
        BST->lchild = Delete( X, BST->lchild); /* 左子樹遞歸刪除 */
    else if( X > BST->Data ) 
        BST->rchild = Delete( X, BST->rchild); /* 右子樹遞歸刪除 */
    else /*找到要刪除的結點 */ 
        if( BST->lchild && BST->rchild ) { /*被刪除結點有左右兩個子結點 */ 
            Tmp = FindMin( BST->rchild );
            /*在右子樹中找最小的元素填充刪除結點*/
            BST->Data = Tmp->Data; 
            BST->rchild = Delete( BST->Data, BST->rchild); 
            /*在刪除結點的右子樹中刪除最小元素*/
        } else { /*被刪除結點有一個或無子結點*/ 
            Tmp = BST;
            if( !BST->lchild ) /* 有右孩子或無子結點*/ 
                BST = BST->rchild;
            else if( !BST->rchild ) /*有左孩子或無子結點*/ 
                BST = BST->lchild;
            free( Tmp );
        }
    return BST;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM