叶子结点

常用算法(冒泡、插入、选择、快速)和二叉树详解

浪子不回头ぞ 提交于 2020-04-08 13:59:31
  同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。   计算机科学中,算法的 时间复杂度 是一个函数,它定量描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号(Order)表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况。 定义   在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。 算法复杂度   算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。(算法的复杂性体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度)。 时间复杂度   1. 一般情况下,算法的基本操作重复执行的次数是模块n的某一个函数f(n),因此,算法的时间复杂度记做:T(n)=O(f(n)) 分析:随着模块n的增大,算法执行的时间的增长率和 f(n) 的增长率成正比,所以 f(n) 越小,算法的时间复杂度越低,算法的效率越高。   2.

树结点数

本小妞迷上赌 提交于 2020-04-06 11:02:21
树结点数 0.概念 树(tree)指每个结点只有一个前件(也称父结点)、有多个后件(也称子结点)的非线性结构。没有父结点的结点称为根结点,每棵树只能有一个根结点;没有子结点的结点称为叶子结点。树结构中,一个结点拥有子结点的个数称为该结点的度;所有结点中最大的度称为这棵树的度。 1.结点数计算 假设树度为 x 的结点数为 n x ,则一棵树可以表示为: x 0 1 2 3 ... nₓ n₀ n₁ n₂ n₃ ... 根据树的形成过程,每增加一个度为 x 的结点,总结点数将增加 x 个。所以: \[Sum = \sum n_i = 1 + \sum i \times n_i \] 其中 Sum 表示树的总节点数。 同理,每增加一个度为 x 的结点,叶子节点数将增加 x-1 个。所以: \[Sum' = n_0 = 1 + \sum n_i(i-1) = 1 + \sum_{i=2} n_i(i-1) \] 其中 Sum' 表示树的叶子结点数。 2.二叉树特例 二叉树度小于3的树。即每个结点最多有两个子结点。有如下性质: 第k层上最多有 2 k-1 个结点。 k层二叉树最多有 2 k -1 个结点。 叶子结点总比度为2的结点多一个。 \[Sum' = 1 + \sum_{i=2} n_i(i-1) = 1 + n_2 \] 具有n个结点的二叉数深度最少为 [log 2 (n+1)]+1

堆排序原理及其js实现

送分小仙女□ 提交于 2020-04-06 07:56:12
图文来源:https://www.cnblogs.com/chengxiao/p/6129630.html 堆排序是利用 堆 这种数据结构而设计的一种排序算法,堆排序是一种 选择排序, 它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。堆排序是利用 堆 这种数据结构而设计的一种排序算法,堆排序是一种 选择排序, 它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。 堆     堆是具有以下性质的 完全二叉树 :每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图: 同时,我们对堆中的结点按层进行编号,将这种逻辑结构映射到数组中就是下面这个样子 该数组从逻辑上讲就是一个堆结构,我们用简单的公式来描述一下堆的定义就是: 大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2] 小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2] 接下来,我们来看看堆排序的基本思想及基本步骤: 堆排序基本思想及步骤 堆排序的基本思想是:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n

一文讲透数据结构中的树,建议收藏!

跟風遠走 提交于 2020-04-04 10:32:16
数据结构是 10 年前大学里学的一门课程,也是我北漂唯一携带的一本书。幸运的是,书还没有被孩子给撕碎。 为了让大家都能够搞懂「树」这个苦涩而硬核的知识,今天就重拾记忆,分享一下研发人员心中那些放不下的「树」。 不过,一定要冲好咖啡、沏壶好茶,心平气和去看文。 01. 「树」现实与虚拟的抽象 在「中华姓氏树」中寻找一片属于你的叶子,探寻一下家族的来源。 在脑海里尝试画一下「家谱树」。 看完现实中的树,那来看一看计算机的文件系统组织形式。 无论是现实的姓氏树、家谱树,还是计算机的文件系统,表现形式虽然不同,但是本质上却都是树。 那到底什么是树呢? 树是由 n(n≥0)个结点组成的有限集合。 当 n = 0 时,称为空树; 当 n > 0 时,有一个特殊的节点称为根结点(root),它没有前驱结点;其它结点分为 m 棵互不相交的子树。 如图示意,(a)为空树;(b)为 1 个结点的树;(c)为 n 个结点的树。 知道了什么是树,上面「家谱树」以及「文件系统」用到的树表示法,有没有学名呢?稍微科普一下。 图示法:是树的直观表示法,主要用于描述树的逻辑结构,如上面提到的家谱树。 横向凹入表示法:是用逐层缩进方法表示结点之间的层次关系,主要用于树的屏幕显示和打印输出,如上面提到的文件系统。 知道了什么树以及树的部分表示法,但是猿有猿声,鸟有鸟语,树也有术语。 02.「树」有术语 节点 or

tarjan算法求最近公共祖先

陌路散爱 提交于 2020-04-04 04:20:32
tarjian算法 LCA: LCA(Least Common Ancestor),顾名思义,是指在一棵树中,距离两个点最近的两者的公共节点。也就是说,在两个点通往根的道路上,肯定会有公共的节点,我们就是要求找到公共的节点中,深度尽量深的点。还可以表示成另一种说法,就是如果把树看成是一个图,这找到这两个点中的最短距离。 LCA算法有在线算法也有离线算法,所谓的在线算法就是实时性的,而离线算法则是要求一次性读入所有的请求,然后在统一得处理。而在处理的过程中不一定是按照请求的输入顺序来处理的。说不定后输入的请求在算法的执行过程中是被先处理的。 tarjan算法。这个算法是基于并查集和DFS的。离线算法。 现在我们来观察正在处理与x结点关联的询问时并查集的情况。由于一个结点处理完毕后,它就被归到其父结点所在的集合,所以在已经处理过的结点中(包括 x本身),x结点本身构成了与x的LCA是x的集合,x结点的父结点及以x的所有已处理的兄弟结点为根的子树构成了与x的LCA是father[x]的集合,x结点的父结点的父结点及以x的父结点的所有已处理的兄弟结点为根的子树构成了与x的LCA是father[father[x]]的集合……(上面这几句话如果看着别扭,就分析一下句子成分,也可参照右面的图)假设有一个询问(x,y)(y是已处理的结点),在并查集中查到y所属集合的根是z,那么z

二叉树结点间最大距离

浪子不回头ぞ 提交于 2020-04-03 18:42:51
如果把二叉树看成一个图,父子节点之间的连线看成是双向的,则定义距离为:两个节点之间边的个数 求一棵二叉树中相距最远的两个节点之间的距离 相距最远的两个节点一定是叶子节点,可以分为两种情况: 1.若最远距离的路径经过根ROOT,则两个最远的节点分别为两个不同子树的叶子结点,如图1 图1 2.若路径不经过ROOT,那么这两个节点一定属于根的K个子树之一,并且它们也是该子树中相距最远的两个顶点,如图2 图2 总结: 最大距离为某个结点左子树的高度加上右子树高度 /********************************************************************************/ /* 计算二叉树中节点的最大距离,即求一棵二叉树中相距最远的两个节点之间的距离 */ /********************************************************************************/ #include<iostream> #include<malloc.h> #include<stdlib.h> #define ERROR 0 using namespace std; struct BiTree//标识一棵树 { BiTree *lchild; BiTree *rchild; int m_nValue

【封装】二叉树相关算法的实验验证

天大地大妈咪最大 提交于 2020-04-01 08:34:40
二叉树的一些基本知识: 二叉树与树有许多相似之处,但二叉树不是树的特殊情形。 定义 在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。 二 叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2^{i-1}个结点; 深度为k 的二叉树至多有2^k-1个结点; 对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。 一棵深度为k,且有2^k-1个节点称之为满二叉树;深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中,序号为1至n的节点对应时,称之为完全二叉树。 相关术语 树的结点:包含一个数据元素及若干指向子树的分支; 孩子结点:结点的子树的根称为该结点的孩子; 双亲结点:B 结点是A 结点的孩子,则A结点是B 结点的双亲; 兄弟结点:同一双亲的孩子结点; 堂兄结点:同一层上结点; 祖先结点: 从根到该结点的所经分支上的所有结点子孙结点:以某结点为根的子树中任一结点都称为该结点的子孙 结点层:根结点的层定义为1;根的孩子为第二层结点,依此类推; 树的深度:树中最大的结点层 结点的度:结点子树的个数 树的度: 树中最大的结点度。

二叉树的概念和基本术语

狂风中的少年 提交于 2020-04-01 08:33:04
二叉树简单说就是有两个子树的树 1.种类及概念:   二叉树是每个结点最多有两个子树的树结构。   完全二叉树:除最后一层外,若其余层都是满的,并且最后一层或者是满的,或者是在右边缺少连续若干节点。   满二叉树:每一层上的节点数都是最大节点数,深度为k,且有2^k-1个节点。   平衡二叉树:又被称为AVL树(区别于AVL算法),它是一棵二叉排序树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。   森林:不考虑连通性,允许图中有多个连通分量的结构。           (1) 空二叉树:图 (a)      (2) 只有一个根结点的二叉树:图 (b)      (3) 只有左子树:图 (c)      (4) 只有右子树:图 (d)      (5) 完全二叉树:图 (e) 2.定义及性质:   二叉树常被用于实现二叉查找树和二叉堆。   二叉树是一个连通的无环图,并且每一个顶点的度不大于3。有根二叉树还要满足根结点的度不大于2。有了根结点之后,每个顶点定义了唯一的父结点,和最多2个子结点。   二叉树不是树的一种特殊情形,树和二叉树有两个主要差别:     1. 树中结点的最大度数没有限制,而二叉树结点的最大度数为 2 ;     2. 树的结点无左、右之分,而二叉树的结点有左、右之分。 3.其他术语: 子树

二叉树的几个重要性质、抽象数据类型定义、存储结构、构造

眉间皱痕 提交于 2020-04-01 08:32:06
  二叉树T:一个有穷的结点集合。 这个集合可以为空 若不为空,则它是由根结点和称为其左子树TL和右子树TR的 两个不相交的二叉树组成。 一、二叉树的几个重要性质   1、 设二叉树的 根结点为第一层 , 二叉树第i层的最大结点数是 2 i-1 ,i>=1; 设二叉树的 根结点深度为1 , 深度为k的二叉树,最大结点总数为 2 k -1 ,k>=1 (关于树的层、深度,上面是浙大数据结构的说法,也有定义根结点的层数为0,深度为0,从上向下增长;叶结点高度为0,从下向上增长。)   2、对于任何非空二叉树,叶子结点的个数,等于度为2的非叶子结点的个数+1,即 n0 = n2 + 1   3、满二叉树(full binary trees),在树中,每个中间结点有且仅有两个孩子结点。   4、完全二叉树(complete binary trees),具有n个结点的完全二叉树的深度为 log 2 n + 1   若对n个结点的完全二叉树从上到下且从左到右进行1至n编号,则对完全二叉树中任意一个编号为i的结点:     1、)若 i = 1 ,则该结点是二叉树的根,无双亲结点,否则 i/2 的结点为其双亲结点;     2、)若 2i<=n ,则,编号为 2i 的结点为其左孩子结点,否则,该结点无左孩子结点;     3、)若 2i+1<=n ,则,编号为 2i+1 的结点为其右孩子结点

二叉树

天大地大妈咪最大 提交于 2020-04-01 08:27:44
二叉树:每个结点至多有两个子树 满二叉树:每一层的结点个数都是最大结点数 完全二叉树:叶子节点在最后两层;对于任一结点,左子树的深度比右子树深度大1或者相等 性质: 二叉树:第i层,至多有2^(i-1)个结点 二叉树:深度为k的二叉树,至多有(2^k)-1个结点 满二叉树:深度为k的满二叉树的结点个数为(2^k)-1 二叉树:任何一个二叉树,度为0的结点的个数n0,度为1的结点的个数n1,度为2的结点的个数的关系: n0 = n2+1,总的结点个数n   原因:n0+n1+n2 = n 除了根节点之外,其它几点都有一个分支进入分支个数n-1,分支都是由度为1或者度为2的结点发出的 n1+2*n2 = n-1 根据这两个公式得到n0=n2+1 完全二叉树:任何一个具有n个结点的完全二叉树的深度为 log以2为底n向下取整 + 1 完全二叉树:任何一个完全二叉树按照层次为结点编号   i=1,该结点是完全二叉树的根,无双亲   i>1,该节点不是根,该结点的双亲的编号为i/2向下取整   一个结点的编号是i,如果2*i大于n,表明该结点没有左孩子,否则,左孩子编号为2*i   一个结点的编号是i,如果2*i+1大于n,表明该结点没有右孩子,否则,右孩子编号为2*i 存储 (1)顺序存储 用一组地址连续的存储单元将二叉树从上到下从左到右按顺序存储,存储成对应的完全二叉树的形式