编程实现采用二叉链表存储结构创建一个二叉树并进行先序遍历;_大贝贝,基础数据结构...

本文介绍了线性表、栈与队列的基础知识,并重点讲解了树与二叉树,特别是如何使用二叉链表存储结构创建二叉树以及进行先序遍历。详细阐述了栈的后进先出特性、队列的先进先出特性,以及优先队列的操作。此外,还提到了二叉查找树、AVL树、红黑树和堆的概念及其特点。
摘要由CSDN通过智能技术生成
一、线性表
1.数组实现
2.链表
二、栈与队列、优先队列
三、树与二叉树
1.树
2.二叉树基本概念
3.二叉查找树
4.平衡二叉树

5.红黑树

  6.堆

四、图
五、总结

一、线性表

线性表是最常用且最简单的一种数据结构,它是n个数据元素的有限序列。

  1. 数组:

    用一组连续的存储单元依次存储线性表的数据元素。

    43ca7279494563b9242a9167c3b2333a.png

  2. 链表:

    用一组任意的存储单元存储线性表的数据元素(存储单元可以是连续的,也可以是不连续的)。链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列节点组成,这些节点不必在内存中相连。每个节点由数据部分Data和链部分Next,Next指向下一个节点,这样当添加或者删除时,只需要改变相关节点的Next的指向,效率很高。链表的实现还有其它的方式,常见的有循环单链表,双向链表,循环双向链表。循环单链表 主要是链表的最后一个节点指向第一个节点,整体构成一个链环。双向链表 主要是节点中包含两个指针部分,一个指向前驱元,一个指向后继元。循环双向链表,是最后一个节点指向第一个节点。

    f7d9cb45a01aff5fad0b3c3da42811ca.png3915646bdef6ad8a3530dc0a45dcd6f8.png

二、栈与队列

栈和队列也是比较常见的数据结构,它们是比较特殊的线性表.

7073b40c7cb2c825162529ea349f8879.png1e81141be9477baa6c58f639fcbbf930.png

  1. 栈:

栈是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫作栈顶,对栈的基本操作有push(进栈)和pop(出栈),前者相当于插入,后者相当于删除最后一个元素。栈有时又叫作LIFO(Last In First Out)表,即后进先出。对于栈来说,访问、插入和删除元素只能在栈顶进行。

    2. 队列:

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。对于队列来说,元素只能从队列尾插入,从队列头访问和删除。普通的队列是一种先进先出的数据结构,而优先队列中,元素都被赋予优先级。当访问元素的时候,具有最高优先级的元素最先被删除。

    3. 优先队列:

优先队列的特点则遵守以下两条规则:    - 最大优先队列:无论入队的顺序,当前最大的元素先出列。
    - 最小优先队列:无论入队的顺序,当前最小的元素先出列。

对于优先队列,介绍以下几种操作:入队操作;出队操作;
        说明:以最小优先队列为例

  1. 入队操作
    优先队列本质上就是用二叉堆来实现的,每次插入一个数据都是插入到数据数组的最后一个位置,然后再做上浮操作,如果插入的数是数组中最大数,自然会上浮到堆顶。如“图1 入队操作”所示:

fdb3b52a9ee7f8114cb50b0fe6837d41.png

    b.出队操作
    出队操作就是返回堆顶最小堆的数据之后用数组最后的数插入到堆顶,之后再做下沉操作。如“图2 出队操作”所示:

207fbe165dbae098e7b93087a850b6f0.png

二叉堆上浮和下沉的时间复杂度都为log2(n),所以入队和出队的时间复杂度也是log2(n)。

三、树与二叉树

树型结构是一类非常重要的非线性数据结构,其中以树和二叉树最为常用。

  1. 树:

    树 是由n(n>=1)个有限节点组成一个具有层次关系的集合。它具有以下特点:每个节点有零个或多个子节点;没有父节点的节点称为 根 节点;每一个非根节点有且只有一个 父节点 ;除了根节点外,每个子节点可以分为多个不相交的子树。

    8c6b215862ee00f72ee412fbecc25a63.png

  2. 二叉树:

    二叉树是每个节点最多有两棵子树的树结构。通常子树被称作“左子树”和“右子树”。二叉树常被用于实现二叉查找树和二叉堆。一棵深度为k,且有2^k-1个节点的二叉树称之为满二叉树;深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中,序号为1至n的节点对应时,称之为完全二叉树

    1f0ba34a28bfcc62eaf75501a31f1529.png

    二叉树主要是由3个基本单元组成,根节点、左子树和右子树。如果限定先左后右,那么根据这三个部分遍历的顺序不同,可以分为先序遍历、中序遍历和后续遍历三种。(1) 先序遍历 若二叉树为空,则空操作,否则先访问根节点,再先序遍历左子树,最后先序遍历右子树。(2) 中序遍历 若二叉树为空,则空操作,否则先中序遍历左子树,再访问根节点,最后中序遍历右子树。(3) 后序遍历 若二叉树为空,则空操作,否则先后序遍历左子树访问根节点,再后序遍历右子树,最后访问根节点。

    6a6bdcf4eec3a7518072dfa1241c2d57.png

  3. 二叉查找树:

    二叉查找树就是二叉排序树,也叫二叉搜索树。二叉查找树或者是一棵空树,或者是具有下列性质的二叉树:(1) 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2) 若右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3) 左、右子树也分别为二叉排序树;(4) 没有键值相等的结点。BST 的中序遍历结果是有序的(升序)

    66fb6896bc7311849b625d727b92604e.png

  4. 平衡二叉树:平衡二叉树又称AVL树,它或者是一棵空树,或者是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。AVL树是最先发明的自平衡二叉查找树算法。在AVL中任何节点的两个儿子子树的高度最大差别为1,所以它也被称为高度平衡树,n个结点的AVL树最大深度约1.44log2n。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。

    91dcf77135ed860779be061439de3c60.png

  5. 红黑树:

    红黑树是平衡二叉树的一种,它保证在最坏情况下基本动态集合操作的事件复杂度为O(log n)。红黑树和平衡二叉树区别如下:(1) 红黑树放弃了追求完全平衡,追求大致平衡,在与平衡二叉树的时间复杂度相差不大的情况下,保证每次插入最多只需要三次旋转就能达到平衡,实现起来也更为简单。(2) 平衡二叉树追求绝对平衡,条件比较苛刻,实现起来比较麻烦,每次插入新节点之后需要旋转的次数不能预知。

  6. 堆heap:

    堆就是用数组实现的二叉树,所以它没有使用父指针或者子指针。堆根据“堆属性”来排序,“堆属性”决定了树中节点的位置。

    堆分为两种:最大堆最小堆,两者的差别在于节点的排序方式。在最大堆中,父节点的值比每一个子节点的值都要大。在最小堆中,父节点的值比每一个子节点的值都要小。这就是所谓的“堆属性”,并且这个属性对堆中的每一个节点都成立。根据这一属性,那么最大堆总是将其中的最大值存放在树的根节点。而对于最小堆,根节点中的元素总是树中的最小值。堆属性非常有用,因为堆常常被当做优先队列使用,因为可以快速地访问到“最重要”的元素。

    注意:堆的根节点中存放的是最大或者最小元素,但是其他节点的排序顺序是未知的。例如,在一个最大堆中,最大的那一个元素总是位于 index 0 的位置,但是最小的元素则未必是最后一个元素。--唯一能够保证的是最小的元素是一个叶节点,但是不确定是哪一个。在堆中,在当前层级所有的节点都已经填满之前不允许开是下一层的填充,所以堆总是有这样的形状:

    b8c761128fc691ee5553cd7e83928bf1.png

    上面这个树这样储存:[10,7,2,5,1]

    如果 i 是节点的索引,那么下面的公式就给出了它的父节点和子节点在数组中的位置:

    parent(i) = floor((i - 1)/2)left(i)   = 2i + 1right(i)  = 2i + 2

    注意 right(i) 就是简单的 left(i) + 1。左右节点总是处于相邻的位置。

    堆的常用方法:

    构建优先队列、支持堆排序、快速找出一个集合中的最小值(或者最大值)

        更多请参考:https://www.jianshu.com/p/6b526aa481b1

四、图

图是一种较线性表和树更为复杂的数据结构,在线性表中,数据元素之间仅有线性关系,在树形结构中,数据元素之间有着明显的层次关系,而在图形结构中,节点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。

b09635c361838c5315078a1e17cd7e70.png

5dc5394c00e516339c9ffdffc2361430.png

8864620338f1d2fe902e2c033d61e0a8.png

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值