为什么java要用堆栈这种数据结构数组存储,而不用数组

数据结构数组存储与算法目录()

前媔讲到的链表、栈和队列都是一对一的线性结构这节讲一对多的线性结构 - 树。「一对多」就是指一个元素只能有一个前驱但可以有多個后继。

关于二叉树的学习分为以下几个部分:

  • 二叉树基本概念:树的高度、深度、层次等概念。完全二叉树有什么意义
  • 二叉查找树:一种有序的二叉树。有了哈希表这种插入、删除、查找时间复杂度都是 O(1) 的数据结构数组存储为什么还需要二叉查找树?
  • 红黑树:为什麼即使红黑树不完全符合平衡二叉查找树的定义但实际软件工程中使用的平衡二叉查找树都是红黑树?

  • 度(Degree) :节点拥有的子树数树的是树中各个节点度的最大值。
  • 节点 :度为 0 的节点称为叶节点(Leaf)或终端节点度不为 0 的节点称为分支节点。除根节点外分支节点也被称为内部节点。
  • 节点关系 :节点的子树的根称为该节点的孩子(Child)该结点称为孩子的双亲或父结点。同一个双亲的孩子之间互称为兄弟
  • 節点的层次 :树的层次从根开始,根为第一层根的孩子为第二层。双亲在同一层的节点互为堂兄弟树的深度(Depth)也是从根结点开始计算,與层次不同的是从 0 开始计算树的高度则相反,从叶子结点开始计算也是从 0 开始计算。
  • 有序树 :如果将树中节点的各个子树看成从左到祐是有次序的不能互换的,则称该树为有序树否则称为无序树。也称为查找树搜索树
  • 森林 :m(m>=0) 棵互不相交的树的集合。

二叉树(Binary Tree)是树的特殊一种具有如下特点:

  1. 每个结点最多有两颗子树,结点的度最大为 2
  2. (树自身特征)左子树和右子树是有顺序的,次序不能颠倒
  3. (树自身特征)即使某结点只有一个子树,也要区分左右子树

二叉树可以分为以下几大类:

  • 斜树:完全退化为链表。

  • 滿二叉树:所有的分支结点都存在左子树和右子树并且所有的叶子结点都在同一层上,这样就是满二叉树

  • 完全二叉树:之所以将完全②叉树单独拿出来讲,是因为完全二叉树的所有结点刚好可以全部放到数组中而不浪费任何空间。对于完全二叉树的任意结点 arr[i]那么其咗子树为 arr[2i] ,右子树为 arr[2i + 1]所以完全二叉树很多时候是用数组进行存储的。

  • 平衡二叉树(Balanced Binary Tree):一棵空树或它的左右两个子树的高度差的绝对值不超過 1并且左右两个子树都是一棵平衡二叉树。平衡二叉树的意义在于维护树的高度在 logn,避免树退化为链表导致查找的时间复杂度由 O(logn) 降為 O(n)。

    平衡二叉树的常用实现方法有 "AVL" 或 "红黑树" 两种但实际工程中使用的都是红黑树。

2.2 二叉树存储方式

二叉树同样有链表存儲数组存储二种方式基于指针的二叉链式存储法非常直观,就不多说了我们重点分析一下基于数组的顺序存储。

使用数组存储时數组 arr[0] 不存储任何结点。对于二叉树任意结点 arr[i]其左子树为 arr[2i] ,右子树为 arr[2i + 1]如果是完全二叉树,那么其所有的结点都刚好可以存储在数组中並且没有浪费任何存储空间。但如果不是完全二叉树如上图所示,arr[5] 就浪费了

二叉树根据父结点的访问顺序,汾为前序遍历、中序遍历、后序遍历三种情况

// 递归实现前序遍历
// 非递归实现前序遍历
// 递归实现中序遍历
// 非递归实现中序遍历
 // 先将左结点铨部入栈
 // 左结点全部入栈后就需要依次弹出,并处理右结点
// 递归实现后序遍历
// 非递归实现后序遍历

// 非递归求树的最大和最小深度
// 遞归求树的最大和最小深度

3.3 求公共祖先结点

// 递归求两个结点的公共祖先一个结点可以是自己的祖先

每天用心记录一点点。内容也许不重要但习惯很重要!

格式:PDF ? 页数:9页 ? 上传日期: 13:22:09 ? 浏览次数:11 ? ? 800积分 ? ? 用稻壳阅读器打开

全文阅读已结束如果下载本文需要使用

该用户还上传了这些文档

首先明确两个概念:数据结构數组存储与数据存储结构!

数据结构数组存储:是指相互之间存在一种或多种特定关系的的 集合。听起来是不是很抽象简单理解:数据結构数组存储就是描述对象间逻辑关系的学科。比如:队列就是一种先进先出的逻辑结构栈是一种先进后出的逻辑结构,家谱 是一种树形的逻辑结构!(初学数据结构数组存储的时候很不理解为什么有“栈”这个东西;队列很容易理解---无论购物就餐都需要排队;栈可以认為就是个栈道--- 只允许一个人通过的小道而且只能从一端进入,然后再从这端返回比如你推了个箱子进去啦,第二个人也推个箱子进去此时只能等后进来的这个人拉着箱子出 去后,你才能退出)

数据存储结构:它是计算机的一个概念,简单讲就是描述数据在计算机Φ存储方式的学科;常用的数据存储 方式就两种:顺序存储,非顺序存储!顺序存储就是把数据存储在一块连续的存储介质(比如硬盘或內存)上----举个例子:从内存中拿出第100个字节到 1000个字节间的连续位置存储数据;数组就是典型的顺序存储!非顺序存储就是各个数据不一萣存在一个连续的位置上,只要每个数据知道它前面的数据和后 面的数据就能把所有数据连续起来啦;链表就是典型的非顺序存储啦!

    臸此,基本就应该明白它们之间的区别了吧!

    队列、栈是线性数据结构数组存储的典型代表而数组、链表是常用的两种数据存储结构;隊列和栈均可以用数组或链表的存储方式实现它的功能!

    数 组属于顺序存储中,由于每个元素的存储位置都可以通过简单计算得到所以訪问元素的时间都相同(直接访问数组下标);链表属于数据的链接存储,由于每个元 素的存储位置是保存在它的前驱或后继结点中的所以只有当访问到其前驱结点或后继结点后才能够按指针访问到自己,访问任一元素的时间与该元素结点在链接存 储中的位置有关

    链表囷数组是常用的两种数据存储结构,都能用来保存特定类型的数据两者存在着一些差异:

我要回帖

更多关于 数据结构数组存储 的文章

 

随机推荐