二叉搜索树

来源:互联网 发布:php怎样保持登录状态 编辑:程序博客网 时间:2024/06/05 16:11
二叉搜索树定义:
一棵二叉树,可以为空;如果不为空,满足以下性质:
1. 非空左子树的所有键值小于其根结点的键值。
2. 非空右子树的所有键值大于其根结点的键值。
3. 左、右子树都是二叉搜索树
二叉搜索树对应的是二分查找
二叉搜索树的查找、插入和删除:

二叉搜索树的查找可以用递归或者循环,对应于二分查找,复杂度为O(logN)。二叉搜索树最小值在最左边,最大值在最右边。
二叉搜索树的插入删除用递归,复杂度同样为O(logN)。
也就是二叉搜索树的基本操作复杂度均是树的深度。
//二叉搜索树的查找(尾递归)尾递归都可以转换为循环的形式Position Find( ElementType X, BinTree BST ){    if( !BST ) return NULL; /*查找失败*/    if( X > BST->Data )        return Find( X, BST->Right ); /*在右子树中继续查找*/    else if( X < BST->Data )        return Find( X, BST->Left ); /*在左子树中继续查找*/    else /* X == BST->Data */        return BST; /*查找成功, 返回结点的找到结点的地址*/}//二叉搜索树的查找(循环)Position IterFind( ElementType X, BinTree BST ){    while( BST ) {        if( X > BST->Data )            BST = BST->Right; /*向右子树中移动, 继续查找*/        else if( X < BST->Data )            BST = BST->Left; /*向左子树中移动, 继续查找*/        else /* X == BST->Data */            return BST; /*查找成功, 返回结点的找到结点的地址*/    }return NULL; /*查找失败*/}//二叉搜索树的查找最小元素Position FindMin( BinTree BST ){    if( !BST ) return NULL; /*空的二叉搜索树,返回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;}//二叉搜索树的插入BinTree Insert( BinTree BST, ElementType X ){    if( !BST ){ /* 若原树为空,生成并返回一个结点的二叉搜索树 */        BST = (BinTree)malloc(sizeof(struct TNode));        BST->Data = X;        BST->Left = BST->Right = NULL;    }    else { /* 开始找要插入元素的位置 */        if( X < BST->Data )            BST->Left = Insert( BST->Left, X );   /*递归插入左子树*/        else  if( X > BST->Data )            BST->Right = Insert( BST->Right, X ); /*递归插入右子树*/        /* else X已经存在,什么都不做 */    }    return BST;}//二叉搜索树的删除 BinTree Delete( BinTree BST, ElementType X ) {     Position Tmp;      if( !BST )         printf("要删除的元素未找到");     else {        if( X < BST->Data )             BST->Left = Delete( BST->Left, X );   /* 从左子树递归删除 */        else if( X > BST->Data )             BST->Right = Delete( BST->Right, X ); /* 从右子树递归删除 */        else { /* BST就是要删除的结点 */            /* 如果被删除结点有左右两个子结点 */             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                   /* 只有左孩子 */                    BST = BST->Left;                free( Tmp );            }        }    }    return BST;}


原创粉丝点击