最优二叉树算法

PYTHON数据结构与算法学习笔记(六)

[亡魂溺海] 提交于 2020-03-03 02:52:56
目录 树与树算法 树的概念 树的存储与表示 二叉树 二叉树的性质 二叉树的创建 二叉树的遍历 广度优先遍历(层次遍历) 深度优先遍历 树与树算法 树的概念 树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 1、每个节点有零个或多个子节点; 2、没有父节点的节点称为根节点; 3、每一个非根节点有且只有一个父节点; 4、除了根节点外,每个子节点可以分为多个不相交的子树。 例 : 树的术语 1、 节点的度 :一个节点含有的子树的个数称为该节点的度; 2、 树的度 :一棵树中,最大的节点的度称为树的度; 3、 叶节点或终端节点 :度为零的节点; 4、 父节点 :若一个节点含有子节点,则这个节点称为其子节点的父节点; 5、 子节点 :一个节点含有的子树的根节点称为该节点的子节点; 6、 兄弟节点 :具有相同父节点的节点互称为兄弟节点; 7、 节点的层次 :从根开始定义起,根为第1层,根的子节点为第2层,以此类推; 8、 树的高度或深度 :树中节点的最大层次; 9、 堂兄弟节点 :父节点在同一层的节点互为堂兄弟; 10、 节点的祖先 :从根到该节点所经分支上的所有节点;

二叉排序树(Binary Sort Tree)

感情迁移 提交于 2020-03-01 01:23:33
1、定义 二叉排序树(Binary Sort Tree)又称 二叉查找(搜索)树 (Binary Search Tree)。其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树: ① 若它的左子树非空,则左子树上所有结点的值均小于根结点的值; ② 若它的右子树非空,则右子树上所有结点的值均大于根结点的值; ③ 左、右子树本身又各是一棵二叉排序树。 上述性质简称二叉排序树性质(BST性质),故二叉排序树实际上是满足BST性质的二叉树。 注意: 当用线性表作为表的组织形式时,可以有三种查找法。其中以二分查找效率最高。但由于二分查找要求表中结点按关键字有序,且不能用链表作存储结构,因此,当表的插入或删除操作频繁时,为维护表的有序性,势必要移动表中很多结点。这种由移动结点引起的额外时间开销,就会抵消二分查找的优点。也就是说,二分查找只适用于静态查找表。若要对动态查找表进行高效率的查找,可采用下二叉树或树作为表的组织形式。不妨将它们统称为树表。 2、特点 由BST性质可得: (1) 二叉排序树中任一结点x,其左(右)子树中任一结点y(若存在)的关键字必小(大)于x的关键字。 (2) 二叉排序树中,各结点关键字是惟一的。 注意: 实际应用中,不能保证被查找的数据集中各元素的关键字互不相同,所以可将二叉排序树定义中BST性质(1)里的"小于"改为"大于等于",或将BST性质(2)里的"大于

树与二叉树

戏子无情 提交于 2020-01-30 11:11:20
树 有许多逻辑关系并不是简单的线性关系,在实际场景中,常常存在着一对多,甚至是多对多的情况。其中树和图就是典型的非线性数据结构,我们首先讲一讲树的知识。 什么是树呢?在现实生活中有很多体现树的逻辑的例子。例如你家的“家谱”,就是一个“树”。再如企业里的职级关系,也是一个“树”。 除人与人之间的关系之外,许多抽象的东西也可以成为一个“树”,如一本书的目录。 以上这些例子有什么共同点呢?为什么可以称它们为“树”呢?因为它们都像自然界中的树一样,从同一个“根”衍生出许多“枝干”,再从每一个“枝干”衍生出许多更小的“枝干”,最后衍生出更多的“叶子”。 树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 每个节点有零个或多个子节点; 没有父节点的节点称为根节点; 每一个非根节点有且只有一个父节点; 除了根节点外,每个子节点可以分为多个不相交的子树; 下面这张图,就是一个标准的树结构。 在上图中,节点1是根节点(root);节点5、6、7、8是树的末端,没有“孩子”,被称为叶子节点(leaf)。图中的虚线部分,是根节点1的其中一个子树。 同时,树的结构从根节点到叶子节点

一步步地分析排序——优先队列和堆排序

断了今生、忘了曾经 提交于 2020-01-15 03:55:00
本文框架 定义和使用场景 优先队列是一个抽象数据类型,和栈、队列类似,它们都是抽象数据类型,相当于一个Java类,有自己的属性,并对外提供API。在了解它有什么API之前,先来看看优先队列的使用场景。 优先队列适用于需要对集合不断地执行插入元素、删除最大(或最小)元素的场景。这个场景大体可以分为两类: 第一类是业务实际情况需要,比如CPU的任务调度,待执行的任务是一个集合,每启动一个新程序就是在向集合里面插入元素。当前程序执行完后,就要从集合里面取出下一个优先级最高的程序。不断地有程序被启动和被执行,就像不断地对集合执行插入、删除最大元素的操作。 第二类场景是“从N个元素里获取最大的M个元素,N很大,不能一次性全部读进内存”,比如从银行成百上千万条交易记录里面找到金额最大的10笔交易;或者从全国的手机号码里面找到使用年限最长的10个号码。对于第二类场景,问题本身并不需要不断地对集合进行插入、删除操作。如果内存没有限制的话,你可以一次性将数据全部装进集合,然后随便选择一个排序算法对集合进行降序排列,接着输出最前面的10个元素。但是由于待处理的数据量过大(相对内存而言),不能使用排序算法解决该类问题,以银行交易记录为例子,你可以用优先队列通过如下步骤解决: 创建一个容量为11的集合 向集合里插入一笔交易记录,如果插入后集合的元素达到11个,删除金额最小的一笔交易( 需要注意的是

数据结构基础概念篇

半城伤御伤魂 提交于 2019-12-21 23:46:01
数据结构基础概念篇 原创 小草莓lllll 发布于2017-11-14 13:44:24 阅读数 158267 收藏 更新于2017-11-14 13:44:24 分类专栏: 数据结构与算法 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/qq_31196849/article/details/78529724 展开 <h1 id="数据结构"><a name="t0"></a><a name="t0"></a>数据结构</h1> 一些概念 数据结构就是研究数据的 逻辑结构 和 物理结构 以及它们之间 相互关系 ,并对这种结构定义相应的运算,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。 数据:所有能被输入到计算机中,且能被计算机处理的符号的集合。是计算机操作的对象的总称。 数据元素:数据(集合)中的一个“个体”,数据及结构中讨论的 基本 单位 数据项:数据的不可分割的最小单位。一个数据元素可由若干个数据项组成。 数据类型:在一种程序设计语言中,变量所具有的数据种类。整型、浮点型、字符型等等 逻辑结构:数据之间的相互关系。 集合 结构中的数据元素除了同属于一种类型外,别无其它关系。 线性结构 数据元素之间一对一的关系 树形结构 数据元素之间一对多的关系

哈夫曼树

≯℡__Kan透↙ 提交于 2019-12-19 12:39:28
哈夫曼树(Huffman)树又称最优二叉树,是指对于一组带有确定权值的叶子结点所构造的具有带权路径长度最短的二叉树。从树中一个结点到另一个结点之间的分支构成了两结点之间的路径,路径上的分支个数称为路径长度。二叉树的路径长度是指由根结点到所有叶子结点的路径长度之和。如果二叉树中的叶子结点都有一定的权值,则可将这一概念拓展:设二叉树具有n个带权值的叶子结点,则从根结点到每一个叶子结点的路径长度与该叶子结点权值的乘积之和称为二叉树路径长度,记做: WPL=W1L1+W2L2+......+WnLn; 其中:n为二叉树中叶子结点的个数;Wk为第k个叶子的权值;Lk为第k个叶子结点的路径长度。 若给定n个权值,如何构造一棵具有n个给定权值叶子结点的二叉树,使得其带权路径长度WPL最小?哈夫曼根据"权值大的结点尽量靠近根"这一原则,给出了一个带有一般规律的算法,称为"哈夫曼"算法,哈夫曼算法如下: (1)根据给定n个权值{w1,w2,....,wn}构成n棵二叉树的集合F={T1,T2,.....,Tn};其中,每棵二叉树Ti(1<=i<=n)只有一个带权值wi的根结点,其左、右子树均为空。 (2)在F中选取两棵根结点权值最小的二叉树作为左、右子树来构造一棵新的二叉树,且置新的二叉树根结点权值为其左右子树根结点的权值之和。 (3)在F中删除这两棵树,同时将生成新的二叉树加入到F中。 (4)重复

哈夫曼树

孤街浪徒 提交于 2019-12-19 12:38:18
1、哈夫曼树的基本概念 ---- 哈夫曼(Huffman)树又称作最优二叉树,它是n个带权叶子结点构成的所有二叉树中,带权路径长度最小的二叉树。 ---- “路径”就是从树中的一个结点到另一个结点之间的分支构成的部分,而分支的数目就是路径长度。 ---- 树的路径长度:就是从树根到每一结点的路径长度之和。 ---- 考虑带权的结点,结点的带权路径长度为:从该结点到树根之间的路径长度与结点上权的乘积。 ---- 树的带权路径长度WPL(weighted path length):树中所有叶子结点的带权路径长度之和。 假设一个有n个带权叶子结点的二叉树,其权值为{w1,w2,....wn},每个叶子结点带权wk,每个叶子的路径长度为 lk,则从根结点 到各个叶子结点的路径长度与相应的权值的乘积之和叫做二叉树的带权路径长度,通常记作: 如下图所示是由4个叶子结点构成的三棵不同的带权二叉树: 三棵二叉树的带权路径长度为: (a)WPL=9x2+4x2+5x2+2x2=18+8+10+4=40 (b)WPL=9x1+5x2+4x3+2x3=9+10+12+6=37 (c)WPL=4x1+2x2+5x3+9x3=4+4+15+27=50 其中(b)所示的二叉树的WPL最小,此树是哈夫曼树。由上图可知:由n个带权叶子结点所构成的二叉树中,满二叉树或完全二叉树 不一定是最优二叉树

[DS+Algo] 009 树的介绍

青春壹個敷衍的年華 提交于 2019-12-06 21:23:34
目录 1. 树的概念 2. 树的术语 3. 树的种类 4. 常见应用场景 5. 二叉树 1. 树的概念 每个结点(节点)有 0 个或多个子结点 没有父结点的结点称为 根结点 每一个非根结点有且只有一个父结点 除了根结点外,每个子结点可以分为多个不相交的子树 2. 树的术语 术语 释义 结点的度 一个结点含有的子树的个数称 树的度 一棵树中,最大的结点的度 叶结点 / 终端结点 度为零的结点 父亲结点 / 父结点 若一个结点含有子结点,则这个结点称为其子结点的父结点 孩子结点 / 子结点 一个结点含有的子树的根结点称为该结点的子结点 兄弟结点 具有相同父结点的结点互称为兄弟结点 堂兄弟结点 父结点在同一层的结点互为堂兄弟 结点的祖先 从根到该结点所经分支上的所有结点 子孙 以某结点为根的子树中任一结点都称为该结点的子孙 结点的层次 从根开始定义起,根为第1层,根的子结点为第2层,以此类推 树的高度或深度 树中结点的最大层次(根结点的层次) 森林 由 m(m>=0)棵互不相交的树的集合称为森林 3. 树的种类 术语 释义 无序树 树中任意结点的子结点之间没有顺序关系,这种树称为无序树,也称为自由树 有序树 树中任意结点的子结点之间有顺序关系,这种树称为有序树 二叉树 每个结点最多含有两个子树的树称为二叉树 完全二叉树 对于一颗二叉树,假设其深度为 d(d>1) 除了第 d 层外

as

自闭症网瘾萝莉.ら 提交于 2019-12-05 11:59:14
学号20182304 2019-2020-1 《数据结构与面向对象程序设计》第九周学习总结 教材学习内容总结 非线性数据结构——————树,元素组织为层次结构 树的基本概念 概念:树由一组结点和一组边构成,通过结点来存储元素,边表示节点之间的连接 树的相关术语: 根节点:树中唯一没有父节点的节点,位于树的顶层 内部结点:一颗树中既不是根结点也不是叶结点的称为内部结点 叶子:没有孩子的结点称之为叶子 高度/深度:一颗树的层数 度/阶:一棵树中任一结点所具有的最大孩子数目 树的分类 分类标准:任一结点可以具有的最大孩子数目,称为度。我们主要学习二叉树,即每个结点下最多有两个孩子的树。 完全树:底层叶子都位于树的左边的平衡树称为完全树 满树:在一颗n元树中,所有叶子都位于一层,且除叶子外的每个结点都有n个孩子,则该树被称作满树 平衡:树的所有叶子之间相差层数不超过一层的树称为稳定的树 二叉树 性质 二叉树的每一个结点最多具有两个孩子结点 在二叉树的第i层最多有2i-1个结点 深度为k的二叉树最多有2k-1个结点 对任何一棵二叉树,如果其叶结点个数为n0,度为2的结点数为n2则有n0=n2+1 完全二叉树 对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树 满二叉树 每层结点都是满的二叉树 树的遍历(四种方法)

20182301 2019-2020-1 《数据结构与面向对象程序设计》第9周学习总结

Deadly 提交于 2019-12-05 00:26:35
20182301 2019-2020-1 《数据结构与面向对象程序设计》第9周学习总结 教材学习内容总结 第十六章 树的定义 根节点:唯一 节点的度:节点拥有的子树数。度为0:称为终端节点或叶节点 树的度:树内各节点的度的最大值 内部节点:除根节点外的节点 孩子(child):节点的子树的根 称为该节点的孩子,反过来,称为双亲(parent) 兄弟(sibling):同一双亲的孩子之间的关系 节点的祖先:从根到该节点所经分支上的全部节点 节点层次:根为第一层,根的孩子为第二层 树的深度(Depth):树中节点的最大层次 森林(Forest):是m(m>0)棵互不相交的树的集合 树的分类 满二叉树 如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。 如果一个二叉树的层数为K,且结点总数是(2^k) -1,则它就是满二叉树。 完全二叉树 它是由满二叉树而引出来的。 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边, 线索二叉树 n个结点的二叉链表中含有n+1(2n-(n-1)=n+1)个空指针域(就是用于指向左右孩子的域)。 利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")。 加上线索的二叉树称为线索二叉树。 哈夫曼树(霍夫曼树)又称为最优树