2019年9月3日11:31:25 接下来进入树的章节 首先主要是学习树与二叉树的基础知识,为后续二叉树的应用打好铺垫;BST树;AVL树;以及红黑树等。
数据结构中知识繁杂,但是都很重要。毕竟数据结构与算法 是我们计算机专业最重要的一门课。来,先看一眼下图:
曾经有一个 建工转行要当程序员的老哥问我,当一个挣大钱的程序员需要学哪些内容?我给他拿出了上图,他大为不解的 问我:为什么不是什么 C C++等?唉 没有一个强大的数据结构功底,以及灵活应变的算法思想 这样的程序员是 没有内涵、没有灵魂的,顶多充其量 是个“码农”。上图所示,虽是看着复杂,然而这都是 非常基础的内容了,还希望大家学习的时候 一步一个脚印,人可以骗别人,可是能骗得了自己吗?
注:前几天,我已经把《DSA之十大排序算法系列》全部的内容更新完了,以及附带了自己亲自写的源代码 都是经过测试过的。不管是 代码或者是内容上的问题,都可以给我留言,我不想把当程序员当成一种职业 我更喜欢的可能就是:这是我的爱好。对了:我的源代码都放在了GitHub上 DSA之十大排序算法系列
话不多说:学习 开始
在我们现实生活,除了排队买包子的队列、火车进站出站之栈、又或者是麻将桌上的自己的牌之线性表等等的一对一的线性结构。我们很常见的 家族族谱、生物基因重组等都是很多一对多的情况需要处理,因此这里 需要研究一对多的数据结构来解决这类问题。
注:这里参考教材有:严奶奶的数据结构 和 邓公的DSA。
之所以被称为树:是因为它看起来像一棵倒挂的树,也就是说它是根在上,而叶子向下的。树 是有着n (n>=0)个结点的有限集合。当n=0 时为空树。 n!=0时,在任意一颗非空的树中:
一棵树的定义从实质上来看:也是一种递归调用的经典应用,也即在树的定义的同时也使用到了树的概念。如下图中子树 T1 和 子树 T2 就是根结点A的子树,同时D、G、H、I组成的树又是以B为根节点的子树,E、J、F组成的树又是以C为根节点的另一个子树。
结点的度—— —结点拥有的子树数称为结点的度(Degree)
树的度 —— 一棵树中最大的结点度数
双亲—— 孩子结点的上层结点叫该结点的双亲
兄弟—— 同一双亲的孩子之间互成为兄弟
祖先—— 结点的祖先是从根到该结点所经分支上的所有结点
子孙—— 以某结点为根的子树中的任一结点都成为该结点的子孙
结点的高度—— 从叶结点开始自底向上逐层累加。
结点的深度—— 从根节点开始自顶向下逐层累加。
结点的层次—— 从根结点算起,根为第一层,它的孩子为第二层……
堂兄弟—— 其双亲在同一层的结点互称为堂兄弟。
树的深度/高度—— 树中结点的最大层次数
有序树—— 如果将树中结点的各子树看成从左至右是有次序的(即不能互换),则称该树为有序树,否则称为无序树。在有序树中最左边的子树的根称为第一个孩子,最右边的称为最后一个孩子。
森林—— m(m > 0)棵互不相交的树的集合,也即多棵树的集合
路径—— 两个结点之间的结点序列,不包括两个端点。
路径长度—— 两个节点之间的边数。
结点类型主要有叶子节点 和 分支结点两种。
树中的结点是由一个数据元素 及若干指向其子树的分支组成的。一个结点拥有的子树数被称为是结点的度(Degree)。其中度为0的结点称为叶子节点(Leaf)或终端结点;而度不为0的结点称为非终端结点或分支结点。除根节点外,分支结点也称为内部结点。一棵树的度则是树内每个结点 度的最大值。
如上图所示:A的度为2,树内结点的度最大是D的3,所以这棵以A为root的树的度为3。
一个结点的子树的根称为该结点的孩子结点(child),通常我们称其为子结点;对应的,该结点称为孩子的双亲(parent),通常我们称为父节点。如上图所示:A就是其第一棵子树 的根B的父节点,C是A的孩子结点。
同一个双亲的孩子之间互称为兄弟(Sibling),例如B和C 。结点的祖先是从根到该结点所经分支上的所有结点,例如:G的祖先就是D B A。 反之,以某结点为根的子树中的任一结点都统称为该结点的子孙,例如:C的子孙节点有E J F。
结点的层次(Level)是从根开始定义的,根为第一层,根的孩子为第二层。若某结点在第 i 层,那么其子树的根就在第 i+1 层。如下图所示:A和B的关系
如上图所示:
对于树状结构:树的存储,仅仅使用顺序存储是不能满足树的实现,而且是需要结合顺序存储和链式存储来实现。通常表示一棵树的方法主要有顺序存储结构(双亲表示法)和链式存储结构(孩子表示法、孩子兄弟表示法)。请详见我的博客树的存储结构。
2019年9月8日18:43:57
接下来进入我们的重中之重:
二叉树(Binary Tree)是由n(n≥0)个结点组成的有限集合,该集合为空集时(称为空二叉树)。或者由一个根结点以及两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。每个根结点只有两个子结点的就叫做二叉树。
二叉树作为树的一种特例,还需要满足在一般的树上加两个限制条件:
典型的二叉树如下:
注:二叉树和度为2的树,绝不可以混为一谈。度为2的树至少有3个结点,而二叉树可以为空树。此外,度为2的有序树的孩子结点的左右次序是相对于另一孩子结点而言的,如果某个结点只有一个孩子结点,这个孩子结点就无须区分其左右次序,而二叉树无论其孩子数是否为2均需明确地确定其左右次序,也就是说二叉树的结点次序不是相对于另一结点而言,而是确定的。
单支树:也可以称作是斜树。即:所有的节点都只有左子树的二叉树叫左斜树;所有节点都只有右子树的二叉树叫右斜树。单支树非常明显的特点就是每一层只有一个节点,且节点的个数与二叉树的深度相同。其实线性结构可以理解为树的一种极其特殊的形式。单支树如下所示:
如果对一棵具有着 n个节点的二叉树,按照层序进行编号,如果编号为 i(1=< i <=n )的节点与同样深度的满二叉树中编号为 i 的节点在二叉树中位置完全相同,则这棵二叉树称为完全二叉树。完全二叉树如下图所示:
根据完全二叉树的定义:把完全二叉树的节点与同样深度的满二叉树各个节点进行编号比较,所有节点出现的位置相同,则是完全二叉树。所以,满二叉树一定是一棵完全二叉树,而完全二叉树不一定是满二叉树。
完全二叉树的特性如下:
满二叉树(是特殊的完全二叉树):一颗高度为h,并且含有2*h-1个结点的二叉树称为满二叉树,即树中每一层都含有最多的结点。满二叉树如下图所示:
满二叉树的特性如下:
1. 二叉排序树:在一棵二叉树上满足要求:
二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。这就是我们通常所提到的BST树。BST树如下所示:
二叉排序树或者是一棵空树,或者是具有下列性质的二叉树。其定义如下:
(1)若左子树不空,则 左子树 上所有结点的值均 <= 它的 根结点 的值;
(2)若右子树不空,则 右子树 上所有结点的值均 >= 它的 根结点 的值;
(3)左、右子树也分别为二叉排序树 (递归定义);
2. 平衡二叉树:特殊的二叉排序树,且左、右子树高度的绝对值不超过1。其定义如下:平衡二叉树(Self-balancing binary search tree),就是通常叫做AVL树的(这有别于AVL算法)。且具有以下性质:它是一 棵空树或它的 左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。所以说:平衡二叉树必定是二叉搜索树,反之则不一定。
B树:一种平衡的多路查找树
线索二叉树:其目的是为了加快查找结点前驱和后继的速度。(通过利用n+1个空指针域)
以及RB树等。
注:2019年9月8日20:03:09 后面的高级数据结构非常重要,当然也是非常复杂的。近段时间,将会逐一进行详解更新。