数据结构第三周笔记(1)——树(上)(慕课浙大版本--XiaoYu)

103 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情

3.1 树与树的表示

什么是树

  1. 人类社会家谱,社会组织结构,图书信息管理都是树的一种体现(层次型的组织结构)

  2. 分层次组织在管理上具有更高的效率

    1. 数据管理的基本操作之一:查找

3.1.1 引子(顺序查找)

查找(Searching)

查找:根据某个给定关键字K,从集合R中找出关键字与K相同的记录
    静态查找:集合中记录是固定的
        没有插入和删除操作,只有查找(例如查字典)
    动态查找:集合中记录是动态变化的
        除查找,还可能发生插入和删除
静态查找

方法1:顺序查找

int SequentialSearch (List Tbl,ElementType K)
{
    //  在Element[1]~Element[n]中查找关键字为K的数据元素
    int i;
    Tbl->ElementP[0] = K;//建立哨兵
    for(i = Tbl->Length;Tbl->Element[i] != K;i--);//倒过来做的,从下标大的地方开始往前循环
    return i;//查找成功返回所在单元下标;不成功不返回0
}
​
typedef struct LNode{
    ElementType Element[MAXSIZE];//决定了放的元素有多少个
    int Length;
};
​
顺序查找的一种实现(无"哨兵")
    int SequentialSearch (List Tbl ,ElementType K)
{
    //在Element[1]~Element[n]中查找关键字为K的数据元素
    int i;
    
    for(i=Tbl->Length; i>0 && Tbl->Element[i] != K;i--);
    return i;//查找成功返回所在单元下标,不成功返回0
}
在顺序查找中,如果把下列程序中的循环条件"i>0"去掉,会发生什么后果?
    答案:要查找的元素不存在时发生数组越界(i指向小于0的位置)
    
    "哨兵"的作用:可以在数组的最后或者边界上面设一个值,不用每次去判断它的下标是不是达到我的边界。根据for循环,当碰到我们放置的那个值的时候,循环就该退出来了。这样我们在写判断的时候就可以少写一个判断的分支
        我的理解是这个哨兵通常放置在下标0的地方,然后循环从大往小循环,循环到1如果都没有我们需要的值的时候,放在下标0的地方的哨兵是等于我们需要的值来退出循环,代替了for条件中的不能小于0,防止for循环陷入死循环或者说越界跑到下标负数的地方去了。然后返回值如果是0的话我们就心知肚明没有找到我们想要的值了
        
        这种顺序查找算法的时间复杂度为O(n),平均数是n/2