二叉搜索树

#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;
}
上一篇:Hackerrank Day 23: BST Level-Order Traversal 逐层遍历


下一篇:二叉搜索树BST