day_02_链表、二叉树

来源:互联网 发布:windows无权访问 编辑:程序博客网 时间:2024/05/21 17:04

    • 四链表的基本概念和操作List
      • 1基本分类
      • 2基本操作
    • 五二叉树的基本概念和操作BinaryTree
      • 1基本概念
        • 1二叉树
        • 2满二叉树
        • 3完全二叉树
      • 2基本特征
      • 3存储结构
      • 4基本操作
      • 5遍历方式

四、链表的基本概念和操作(List)

1、基本分类

1)单向线性链表:

每个节点中除了存储数据元素本身之外,还需要保存下一个节点地址的指针,叫做后指针;其中尾节点的后指针是空指针;

2)单向循环链表

与单向线性链表类似,所不同的是让尾节点的后指针指向了头节点,首尾相接构成环状结构;

3)双向线性链表

每个节点中除了存储数据元素本身之外,还需要保存下一个节点的地址(后指针)和上一个节点的地址(前指针);

注意:头节点的前指针和尾节点的后指针都是空指针;

4)双向循环链表:

与双向线性链表类似,所不同的是让尾节点的后指针指向头节点,头节点的前指针指向尾节点,首尾相接构成环状结构;

5)数组链表:

链表中的每一个元素都是一个数组,也就是由数组构成的链表叫做数组链表。

6)链表数组
  字符数组 - 数组中的每一个元素都是字符;
  指针数组 - 数组中的每一个元素都是指针;
  链表数组 - 数组中的每一个元素都是链表;

7)二维链表
  二维数组 - 数组中每一个元素都是一个一维数组;
  二维链表 - 链表中每一个元素都是一个一维链表;

2、基本操作

  1. 实现向链表开头位置插入新节点 - - - - - - - - list_push_head()
  2. 实现向链表末尾位置插入新节点 - - - - - - - - list_push_tail()
  3. 实现向指定位置插入新节点 - - - - - - - - - - - - list_push_pos()
  4. 遍历链表中的所有节点 - - - - - - - - - - - - - - - -list_travel()
  5. 实现删除链表中的头节点 - - - - - - - - - - - - - - list_pop_head()
  6. 实现删除链表中的尾节点 - - - - - - - - - - - - - - list_pop_tail()
  7. 实现删除指定下标位置的节点 - - - - - - - - - - list_pop_pos()

用途:
  主要用于需要进行大量增删操作的场合中;

扩展:
  a.实现判断链表是否为空/为满;
  b.实现计算链表中有效元素的个数;
  c.实现查看头节点的元素值;
  d.实现查看尾节点的元素值;
  e.实现查看中间节点的元素值;
  f.实现逆转链表中的所有节点前后顺序(重点);
  g.实现两个有序单链表的合并,结果依然是有序链表;
  … …


五、二叉树的基本概念和操作(BinaryTree)

1、基本概念

1)二叉树

二叉树就是指每个节点最多有两个子节点的树型结构;

根节点、枝节点、叶子节点、左(右)子节点、大小(节点个数)

2)满二叉树

如果二叉树中每层节点的个数都达到了最大值,并且所有枝节点都有两个子节点,这样的二叉树叫做满二叉树。

3)完全二叉树

如果该二叉树中除了最下面一层外,其他各层的节点数都达到了最大值,并且最下面一层的节点都连续集中在左边,这样的二叉树叫做完全二叉树。

注意:
  栈/队列/链表属于逻辑结构中的线性结构;二叉树属于逻辑结构中的树形结构;

2、基本特征

二叉树具有递归嵌套式的空间结构特征,因此采用递归的方法处理二叉树,常常可以使得算法更加简洁,具体的处理方式如下:

处理(二叉树){    if(二叉树为空)   直接处理;    else    {        处理左子树;=> 递归        (以根节点的左子节点为根节点的小二叉树)        处理右子树;=> 递归        (以根节点的右子节点为根节点的小二叉树)        处理根节点;    }}

3、存储结构

1)采用顺序结构存储二叉树

一般来说,采用从上到下,从左到右依次存放节点的方式,对于非完全二叉树来说需要使用虚节点占位;

2)采用链式结构存储二叉树

每个节点中有三个成员:其中一个用于记录数据元素本身,另外一个用于记录左子节点的地址,最后一个用与记录右子节点的地址;

例:

typedef struct node{    int data;               //记录数据元素本身    struct node* left;      //记录左子节点的地址    struct node* right;     //记录右子节点的地址} Node;

4、基本操作

  1. 创建 - - - - - - - - - - - - - - - binary_tree_create()
  2. 销毁 - - - - - - - - - - - - - - - binary_tree_destroy()
  3. 判断是否为空 - - - - - - - -binary_tree_empty()
  4. 判断是否为满 - - - - - - - -binary_tree_full()
  5. 插入元素 - - - - - - - - - - – binary_tree_insert()
  6. 遍历所有元素 - - - - - - - -binary_tree_travel()
  7. 查找元素 - - - - - - - - - - – binary_tree_find()
  8. 删除元素 - - - - - - - - - - - -binary_tree_delete()
  9. 修改元素 - - - - - - - - - - - -binary_tree_modify()
  10. 获取根节点元素 - - - - - - binary_tree_root()
  11. 计算中元素个数 - - - - - - binary_tree_size()

5、遍历方式

1)先序遍历(DLR => data left right)

遍历根节点 => 遍历左子树 => 遍历右子树  又叫先根遍历;

2) 中序遍历(LDR => left data right)

遍历左子树 => 遍历根节点 => 遍历右子树  又叫中根遍历;

3)后序遍历(LRD => left right data)

遍历左子树 => 遍历右子树 => 遍历根节点  又叫后根遍历;

注意:有序二叉树(满足三个条件)
  a. 若左子树非空,则左子树上的所有节点元素值都小于等于根节点元素值;
  b. 若右子树非空,则右子树上的所有节点元素值都大于等于根节点元素值;
  c. 左右子树内部也分别满足以上特征;

功能:有序二叉树主要用于排序和查找的场合中,又叫做查找二叉树。

练习:

二叉树