算法之数据结构基础(3)

一、回顾

1、数组和链表

数组

  • 定义:数组是有限个相同类型的变量所组成的有序集合
  • 物理存储方式(内存):顺序存储
  • 访问方式:随机访问
  • 时间复杂度:查找为O(1),插入、删除为O(n)

链表

  • 定义:链表是一种链式数据结构,由若干个节点组成,每个节点指向下一节。
  • 物理存储方式(内存):随机存储
  • 访问方式:顺序访问
  • 时间复杂度:查找为O(n),插入、删除为O(1)

2、栈和队列

  • 定义:栈是一种线性逻辑结构,可以由数组、链表实现。
  • 入栈和出栈遵循先入后出原则,FILO(first in last out)

队列

  • 定义:队列是一种线性逻辑结构,可以由数组、链表实现。
  • 入队和出队遵循先入先出的原则,FIFO(first in first out)

3、散列表

散列表

  • 定义:散列表(哈希表),是存储Key-Value映射的集合。
  • 时间复杂度:读写为O(1)
  • 哈希冲突:通过开放寻址法和链表法解决(JDK8中HashMap使用红黑树)

二、树

有很多场景并不只是简单的线性结构,在实际场景中常常存在着一对多、多对多的情况。就是典型的非线性数据结构。
树的结构在生活中犹如家谱、职级关系那样,呈现金字塔形状。又如书本目录,一本书分好多章节,每个章节有分多个小节。

定义:树(tree)是n个节点的有限集。当n=0时称为空树。在任意一个非空树种,有以下特点:

  • 有且仅有一个特定的节点称为根节点
  • 当n>1时,其余节点可分为m个互不相交的有限集,每个集合本身又是一个树,并称为根节点的子树
  • 没有子树的节点称为叶子节点

在这里插入图片描述
在上图中,节点2的上一个节点又叫做父节点(parent),由2节点衍生出来的4、5是2节点的孩子节点(child),节点3也叫做节点2的兄弟节点(sibling)。
树的最大层级数,被称为树的高度/深度。如上图树的高度为3。

三、二叉树

1、初识二叉树

定义:二叉树(binary tree)是树的一种特殊形式。顾名思义,这个树的每个节点最多有2个孩子节点,也可能只有1个,或者没有。二叉树是逻辑结构,可以通过多种物理结构来表达。

结构如图:一个7节点的二叉树,高度为4。
在这里插入图片描述

二叉树节点的两个孩子界定啊,一个称为左孩子(left child),一个称为右孩子(right child)。这两个孩子节点的顺序是固定的,左小右大。

  • 满二叉树:一个二叉树的所有非叶子节点都存在左右孩子,并且所有叶子节点都在同一层级上。如上图1.
  • 完全二叉树:对一个有n个节点的二叉树,按照层级顺序编号,则所有节点的编号从1到n。如果这个树所有节点和同样深度的满二叉树的编号从1到n的节点位置相同,则称这个二叉树为完全二叉树。如上图2.

完全二叉树的条件没有满二叉树那么苛刻。满二叉树要求所有分支都是满的;而完全二叉树只需要保证最后一个节点之前的节点都齐全即可。

2、二叉树的结构

二叉树可以由多种物理结构来表达。

(1)链式

在这里插入图片描述
由链表实现的二叉树。每个节点由数据(data)、左节点(left)和右节点(right) 组成。一个节点最多可以指向左右两个孩子节点。

(2)数组

在这里插入图片描述
使用数组实现时,会按照层级顺序把二叉树的节点放到数组中对应的位置上。如果某一个节点的左孩子或者右孩子节点孔雀,则数组相对应的位置也会空出来。为了方便在数组中定位二叉树的孩子节点和父节点
假设一个父节点的下标时parent。

  • 左孩子节点为:2×parent+1
  • 右孩子节点为:2×parent+2

假设一个左孩子节点的下标是leftChild,那么它的父节点就是(leftChild-1)/2。一个右孩子节点的下标是rightChild,那么它的父节点就是(rightChild-2)/2

由此特性可以得出结论:由数组来实现一个稀疏的二叉树是非常浪费空间的。

3、二叉树的应用

二叉树的主要应用在查找操作和维持相对顺序两个方面。

(1)查找

二叉查找树(binary search tree)

  • 如果左子树不为空,则左子树上所有节点的值均小于根节点的值。
  • 如果右子树不为空,则右子树上所有节点的值均大于根节点的值。
  • 左、右子树也都是二叉查找树。

在这里插入图片描述
例如上图,查找一个值为7的节点。会做以下几个动作。

  1. 访问根节点6,发现7>6,所以继续跟进6的右节点。
  2. 访问6的右孩子节点,发现7<8,所以继续跟进8的左孩子节点。
  3. 访问8的左孩子节点,发现7=7,拿到查询的结果。

对于一个节点分布相对均衡的二叉查找树来说,如果节点总数是n,那么搜索节点的时间复杂度就是O(logn)。和树的深度是一样的。
这种依靠比较大小来逐步查找的方式,和二分查找算法非常相似。

(2)维持相对顺序

二叉查找树的特性,左子树小于父节点,右子树大于父节点。正是这样保证了二叉树的有序性。
因此二叉树又叫做——二叉排序树(binary sort tree)

如上一小节图,来模拟几个插入。

  • 如果插入新的节点5,由于5<6,5>3,5>4。所以5节点最终会被插入的4节点的右孩子位置。
  • 如果插入新的节点10,由于10>6,10>8,10>9,故节点10会被插入到节点9的右孩子位置。

注意:如果顺序插入1~10,会出现一个比较致命的问题,如果插入顺序得不到保证,就会将树的查询时间复杂度变为O(n)。如图。
在这里插入图片描述

这时候就涉及到二叉树的自平衡了。如:

  • 红黑树
  • AVL树
  • 树堆

本章节先不展开介绍。后续补充。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程大帅气

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值