二叉搜索树

内容来自浙江大学数据结构PPT和视频上的内容

1.什么是平衡二叉树

  定义:或是空树或是满足如下性质的树。

(1) 若它的左子树非空,则左子树上所有元素的值均小于根元素的值

(2) 若它的右子树非空,则右子树上所有元素的值均大于根元素的值

(3) 左右字数本身又各是一颗平衡二叉树


2. 二叉树的查找

(1)  查找从根结点开始,如果 树为空,返回 NULL
(2)  若搜索树非空,则根结点 关键字和 X 进行比较 , 并进行不同处理:
1.  X 小于根结点键值 ,只需在 左子树 中继续搜索;
2. 如果X大于根结点的键值, 在右子树中进行继续搜索;
3. 若两者比较结果是相等,搜索完成,返回指向此结点的指针。

2.1 二叉搜索树的查找操作Find

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; /*查找成功, 返回结点的找到结点的地址*/
}

2.2 由于非递归函数的执行效率高,可将“尾递归”函数改为迭代函数

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;}

2.3 查找最大和最小元素

最大元素一定是在树的最右分枝的端结点
最小元素一定是在树的最左分枝的端结点
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;
}

3. 二叉树的插入

关键是要找到元素应该插入的 位置 ,  可以采用与 Find 类似的方法 。

BinTree Insert( ElementType X, BinTree BST )
{
    if( !BST ){
    /*若原树为空, 生成并返回一个结点的二叉搜索树*/
    BST = malloc(sizeof(struct TreeNode));
    BST->Data = X;
    BST->Left = BST->Right = NULL;
    }
    else /*开始找要插入元素的位置*/
        if( X < BST->Data )
            BST->Left = Insert( X, BST->Left);
        /*递归插入左子树*/
    else if( X > BST->Data )
        BST->Right = Insert( X, BST->Right);
        /*递归插入右子树*/
    /* else X已经存在, 什么都不做 */
return BST;
}

4.二叉树的删除

4.1 要删除的是叶结点:直接删除, 并再修改其父结点指针---置为NULL


4.2 要删除的结点只有一个孩子结点: 将父节点的指针指向要删除节点的孩子节点



4.3 删除的结点有左、右两棵子树:另一结点替代被删除结点:右子树的最小元素或者左子树的最大元素




BinTree Delete( ElementType X, BinTree BST )
{   
    Position Tmp;
    if( !BST ) printf("要删除的元素未找到");
    else if( X < BST->Data )
        BST->Left = Delete( X, BST->Left); /* 左子树递归删除 */
    else if( X > BST->Data )
        BST->Right = Delete( X, BST->Right); /* 右子树递归删除 */
    else /*找到要删除的结点 */
        if( BST->Left && BST->Right ) { /*被删除结点有左右两个子结点 */
            Tmp = FindMin( BST->Right );
            /*在右子树中找最小的元素填充删除结点*/
            BST->Data = Tmp->Data;
            BST->Right = Delete( BST->Data, BST->Right);
            /*在删除结点的右子树中删除最小元素*/
        } else { /*被删除结点有一个或无子结点*/
            Tmp = BST;
            if( !BST->Left ) /* 有右孩子或无子结点*/
                BST = BST->Right;
            else if( !BST->Right ) /*有左孩子或无子结点*/
                BST = BST->Left;
            free( Tmp );
        }
return BST;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值