数据结构——浙大网易云课堂记录(一)树(上篇)

本文介绍了数据结构中的查找方法,包括顺序查找和二分查找,重点讲解了二分查找的原理和避免死循环的策略。接着探讨了树的相关概念,如树的度、叶节点等,以及二叉树的性质和存储结构,包括递归遍历和非递归遍历的不同方法。此外,还涉及了二分查找判定树的概念及其在查找效率上的优势。
摘要由CSDN通过智能技术生成

课堂链接

前菜:查找

根据某个给定的关键字K,从集合R中找出与K相同的记录。

  • 静态查找:集合中记录是固定的,没有删除和插入操作。
  • 动态查找:有插入、删除操作。
顺序查找

e.g. 静态查找例子:表如下,表头指针Tbl,Tbl -> Length = 10 表示表的长度。查找时候从表尾,从后往前查找,返回元素K的下标。表头(下标为0)不存放数据。

这里写图片描述

常规写法是这样:

/* 在Tbl[n]到Tbl[1]中查找元素K的位置 */
int SequentialSearch (StaticTable *Tbl, ElementType K){
    int i; // now index
    for(i = Tbl -> Length; i > 0 && Tbl -> Element[i] != K; i--);
    return i;
}

注意到每次for循环中总要判断i > 0,这是为了防止查找越界。那么换一种思路,如果查找到最后一个元素,其实也是到达查找的边界。把下标为0的元素的值设为K,最终总会得到Tbl -> Element[i] = K,i的值若为0,则说明遍历了整个列表都没查找到K;若不为0,则返回位置i。这样可以减少循环中的一次比较次数。

int SequentialSearch (StaticTable *Tbl, ElementType K){
    int i; // now index
    Tbl -> Element[0] = K; // Sentinel element
    for(i = Tbl -> Length; i > 0 && Tbl -> Element[i] != K; i--);
    return i; // returns: the index of Element K ; 0 if K is no found
}

这种查找方法,平均查找次数N/2,时间复杂度O(N)


二分查找

前提:数据有序存放。
这里写图片描述
这里写图片描述
代码如下:

int BinarySearch( StaticTable *Tbl, ElementType K) {
    int left, right, mid, NotFound = -1;
    // 初始值
    left = 1;
    right = Tbl -> length;

    while (left <= right) {
        mid = ( left + right) / 2; // 计算中间元素坐标
        if (Tbl -> Element[mid] < K){
            left = mid + 1;
        }else if (Tbl -> Element[mid] > k){
            right = mid - 1;
        }else{
            return mid
        }
    }
    return NotFound;
}

算法复杂度O(logN)
[Note]: 如果leftright 的更新由left = mid+1right = mid-1 改为left = midright = mid,结果会出错,这跟while 里面的条件有关的。本例中条件为left > right 时(查找失败)退出查找,假如在三个数

 6 9 10

中查找8,为了方便,直接用leftmidright 代表6910
初始:

left = 6
right = 10

进入比较

mid = 9
9 > 8  -->left不变         left = 6
10 > 8 -->right变为mid的值  right = 9

mid = 6
6 < 8  --> left变为mid的值 left = 6
6 < 10 --> right不变       right = 9

此时leftright 相邻,并不破坏while循环规则left <= right,因此进入死循

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值