当前位置: 首页 > news >正文

数据结构基础内容(第六篇:二叉搜索与平衡二叉树)

# 二叉搜索树 Binary Search Tree

1. 非空左子树所有键值小于根节点的键值

2. 非空右子树所有键值大于根节点的键值

3. 左右子树都是二叉搜索树

操作的函数:  

1. Position Find( ElementType X, BinTree BST ):从二叉搜索树BST 中查找元素X,返回其所在结点的地址;

2. Position FindMin( BinTree BST ):从二叉搜索树BST中查找并返回 最小元素所在结点的地址;

3. Position FindMax( BinTree BST ) :从二叉搜索树BST中查找并返回 最大元素所在结点的地址。

4. BinTree Insert( ElementType X, BinTree BST ) 插入

5. BinTree Delete( ElementType X, BinTree BST ) 删除

## 查找  

递归实现  

```c

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

}

```

迭代实现  

```c

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; /*查找失败*/

}

```

## 返回最大值/最小值

最大元素一定在最右分支的端点上

```c

Position FindMax( BinTree BST )

{

    if(BST ) // 结点不空

    {

        while( BST->Right ) // 右儿子不空

            BST = BST->Right; // 则往右

    }

    return BST;

}

```

最小元素在最左段上  

递归法:  

```c

 Position FindMin( BinTree BST )

{

    if( !BST ) return NULL;/*空的二叉搜索树,返回NULL*/

    else if( !BST->Left )

        return BST; /*找到最左叶结点并返回*/

    else

        return FindMin( BST->Left ); /*沿左分支继续查找*/

```

## 插入  

```c

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;

}

```

## 删除  

1. 删除的是叶结点

2. 删除的只有一个孩子的结点

3. 要删除的结点右左右两棵子树,则:

    * 右子树最小元素替代

    * 左子树最大元素替代

实现  

```c

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;

}

```

# 平衡二叉树  Balanced Binary Tree

平均查找长度ASL  

平衡因子(Balance Factor,简称BF): BF(T) = hL-hR,  

|BF(T)| <= 1  

平衡二叉树的高度  

n_h: 高度为h的平衡二叉树最少结点数  

n_h = n_h-1 + n_h-2 + 1  

    = F_h+2 - 1  

给定结点数为 n的AVL树的 最大高度为O(log2n)!

## 调整  

平衡二叉树是搜索树  

右单旋  

麻烦结点在发现者(被破坏者)的右子树的右子树上,因而RR插入,需要RR旋转  

左单旋  

麻烦结点在发现者(被破坏者)的左子树的左子树上,因而LL旋转  

左右旋转  

麻烦结点在发现者(被破坏者)的左子树的右子树上, LR旋转

习题: 是否同一颗二叉搜索树  

1. 根据两个序列分别建树,再判别树是否一样

2. 不建树的判别方法  

3. 建一棵树,再判别其他序列是否与该树一致

http://www.dtcms.com/a/301351.html

相关文章:

  • MySQL锁机制与MVCC原理剖析
  • 直播带货工具About v1.5.10 免费版
  • GEO优化实战:如何在DeepSeek、豆包等AI平台抢占推荐位?
  • MOE架构详解:原理、应用与PyTorch实现
  • 计算圆周率(π)代码实现【c++】
  • Java中排序规则详解
  • cJSON在STM32单片机上使用遇到解析数据失败问题
  • 计算柱状图中最大的矩形【单调栈】
  • Dify 本地化部署深度解析与实战指南
  • 蜣螂优化算法的华丽转身:基于Streamlit的MSIDBO算法可视化平台
  • 【ESP32设备通信】-W5500与ESP32 /ESP32 S3集成
  • MySQL - 性能优化
  • Java面试实战:电商高并发与分布式事务处理
  • maven optional 功能详解
  • Java进阶7:Junit单元测试
  • 数据结构基础内容(第九篇:最短路径)
  • OpenCv中的 KNN 算法实现手写数字的识别
  • 电子电路设计学习
  • git回退版本教程
  • Java validation
  • Java学习第八十部分——Freemarker
  • Linux c网络专栏第三章DPDK
  • Petalinux驱动开发
  • Linux驱动开发笔记(五)——设备树(下)——OF函数
  • 人社部物联网安装调试员的实训平台
  • RabbitMq 常用命令和REST API
  • 9.SpringBoot Web请求参数绑定方法
  • 盛最多水的容器-leetcode
  • 《Java 程序设计》第 7 章 - 继承与多态
  • 记录几个SystemVerilog的语法——时钟块和进程通信