Bliner'Site Bliner'Site

高树靡阴,独木不林。


  • 首页

  • 分类 10

  • 标签 36

  • 归档 214

  • 关于我

  • 搜索

分类:笔记&教程

数据结构之树-树的存储结构(一)-学习笔记-47

发表于 2018-12-04 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 75

引入

前面,我们学习了树的一些基础内容,今天我们就来看看,树有哪些存储结构。说到存储结构我们会想到线性表中的顺序存储结构和链式存储结构,那么树会怎么设计自己的存储结构呢?我们一起来看一看~

树的存储结构

要存储树,用简单的顺序存储结构和链式存储结构都不行。因为树中有双亲、孩子、兄弟这些概念,我们不能用简单的顺序、链式存储结构表达树中各个结点的情况。所以,根据不同的角度,我们有三种存储结构表示一棵树

  • 双亲表示法
  • 孩子表示法
  • 孩子兄弟表示法

双亲表示法

双亲表示法,顾名思义,就是以双亲作为索引的关键词的一种存储方式。

  • 我们先划出一段连续存储空间,类似数组,存储每一个结点
  • 在每个结点中,附设一个指示其双亲结点在数组中位置的元素
  • 也就是说,每个结点直到自己和自己的双亲
#define MAXTREE 100

struct pt{
int data;  // 结点的数据
int parent;  //每个结点父母的位置,也就是数组下标
};

struct tree{
struct pt pointer[MAXTREE];  //100个包含 pt 结构体的数组
int r;  //根的位置,一般是 0,也就是数组第一个元素
int n;  //结点数目
}
阅读全文 »

数据结构之树-树和结点的简介-学习笔记-46

发表于 2018-12-04 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 61

引入

之前我们讲的都是线性表,它们有可以是顺序存储结构或者链式存储结构的数组、链表、栈、队列。我们之前讨论的线性结构都是一对一的。那什么不是一对一呢?例如妈妈的两个孩子,一个妈妈对应了两个孩子,这种一对多的数据结构,我们称之为树。当然了,以后还会有多对多的概念,今天我们先了解一下树的概念。

树的定义

树(Tree)是 n ($n\geq0$) 个结点的有限集。n=0 时,我们称之为空树。
在任意一棵非空树中:

  • 有且仅有一个特定的称之为根(Root)的结点。
  • 当 n>1 时,其余结点可分为 m($m\geq0$)个互补相交的有限集
  • 有限集 T1、T2、….、Tm,其中每一个集合本身又是一棵树
  • 我们称由这些有限集合构成的树,为根的子树(SubTree)。

上面的图中

  • **根:**A 结点是这棵树的根
  • **结点:**每一个圈都是一个结点
  • **子树:**B、C、D、E、F、G、H都是子树
阅读全文 »

数据结构之线性表-KMP 算法(04)-学习笔记-45

发表于 2018-12-04 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 19

引入

未完待续…

阅读全文 »

数据结构之线性表-KMP 算法(03)-学习笔记-44

发表于 2018-12-04 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 20

引入

未完待续…

阅读全文 »

数据结构之线性表-KMP 算法(02)-学习笔记-43

发表于 2018-12-04 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 17

引入

未完待续…

阅读全文 »

数据结构之线性表-KMP 算法(01)-学习笔记-42

发表于 2018-12-04 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 18

引入

未完待续…

阅读全文 »

数据结构之线性表-递归解决八皇后问题-学习笔记-41

发表于 2018-12-04 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 37

引入

八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。

简单思想

  • 将大问题化简称小问题
  • 8X8二维数组的任意一个位置
  • 一行一行来检查,符合要求的就把0改成1
  • 要求就是一列不能有1,一行不能有1,斜着不能有1
  • 一行一行的递归是一部分、检查行列斜有没有棋子1是一部分
  • 递归下去,然后回溯回来,就能将所有的情况列出来了。
阅读全文 »

数据结构之线性表-递归解决汉诺塔问题-学习笔记-40

发表于 2018-12-03 | 分类 笔记&教程 | 评论数: 1 | 阅读次数: 30

引入

传说越南河内某间寺院有三根银棒

  • 其中一根银棒上串 64 个金盘
  • 金盘从上到下,由小至大。
  • 一次只移动一片,不管在那根针上
  • 但小片必须在大片上
  • 从一根银棒按照同样的要求,全部移动到另外一根银棒上,任务完成

若传说属实,僧侣们需要 $2^{64}-1$步才能完成这个任务
若他们每秒可完成一个盘子的移动,就需要 5845 亿年才能完成。整个宇宙现在也不过 137 亿年。

汉诺塔玩具

玩具汉诺塔-图片来自于维基百科
(图片来自于维基百科)

阅读全文 »

数据结构之线性表-递归实现-学习笔记-39

发表于 2018-12-02 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 20

引入

递归学习过编程的基本上都应该大体知道,但是递归的效率并不高,我们通常使用迭代循环,但我在探索未知的情况下,递归可能会更好。我们通过斐波那契数列来了解一下递归。

斐波那契数列

因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34…
即开始有一对儿兔子,然后3个月后兔子长大了,这对兔子会生一对儿兔子,之后的每个月这对儿兔子又生一对儿,假设兔子不会死亡,那么 N 个月后有多少对儿兔子。

理解

数列:1、1、2、3、5、8、13、21、34…
找到数列的规律之后,我们发现,3号数是1号+2号,6号数是4号+5号,即该数前两个数的和。

迭代循环解题

#include <stdio.h>
int main(){
    int f1=1,f2=1,f3;
    //将第1、2个月的数先赋值,作为计算基底
    printf("%12d\t%12d\t",f1,f2);
    //由于已经赋值了,所以就先输出
    for(int i=3;i<41;i++){
        f3=f1+f2;
        printf("%12d\t",f3);
        //利用循环输出第三个月的数,也就是前两个月的和
        if(i%4==0){
            printf("\n");
        }
        //判断换行
        f1=f2;
        f2=f3;
        //将用于相加的两个数向前推移
    }
}
阅读全文 »

数据结构之线性表-顺序存储结构的队列-学习笔记-38

发表于 2018-12-01 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 18

引入

前面我们讲了,如何初始化一个循环队列,今天我们就来讲讲如何在队列中插入和删除数据。

入队列操作

如何判断队列已经满了

0 1 2 3 4 front rear 新 rear : (rear+1)%MAXSIZE
a 0:a 1: (1+1)%5=2
a b 0:a 2: (2+1)%5=3
a b c 0:a 3: (3+1)%5=4
b c d 1:b 4: (4+1)%5=0
c d e 2:c 0: (0+1)%5=1
f c d e 2:c 1 (1+1)%5=2
f g c d e 2:c 2 front=rear 所以满栈了

利用取模这个思路判断满栈就是

  • 就是让尾指针从头到尾不断的移动
  • 利用取模,让尾指针不断的在0~4之间移动
  • 如果尾指针指向了头部,也就是说
  • 可以插入的位置等于队列的第一个结点的位置了
  • 那就证明满栈了
void InsertQueue(struct Queue *q , int e){
    if((q->rear+1)% MAXSIZE==q->front){
        return;
    }
    q->base[q->rear]=e;
    q->rear = (q->rear+1) % MAXSIZE;
}
阅读全文 »
上一页 1 2 3 4 ... 14 下一页
Bliner

Bliner

214 日志 10 分类 36 标签
RSS

推荐阅读

关于GTD中项目“复盘”的一想法
© 2008 - 2026 Bliner
鲁ICP备13021673号