树形结构

组合模式

泪湿孤枕 提交于 2020-03-09 18:57:09
场景引入:树形结构在软件中随处可见,例如操作系统中的目录结构、应用软件中的菜单、办公系统中的公司组织结构等等,如何运用面向对象的方式来处理这种树形结构是组合模式需要解决的问题,组合模式通过一种巧妙的设计方案使得用户可以一致性地处理整个树形结构或者树形结构的一部分,它描述了如何将容器对象和叶子对象进行递归组合,使得用户在使用时无须对其进行区分,可以一致地对待容器对象和叶子对象,这就是组成模式的模式动机 定义:组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。组合模型让客户端可以统一对待单个对象和组合对象 由上图可知,组合模式包含以下3个角色 (1)Component(抽象构件):它可以是接口或抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。 (2)Leaf(叶子构件):它在组合结构中表示叶子节点对象,它实现了在抽象构件中定义的行为 (3)Composite(容器构件):它在组合结构中表示容器节点对象,容器节点包含子节点,其子节点可以是容器或叶子节点 组合模式应用实例 1. 实例说明 某软件公司欲开发一个杀毒(AntiVirus)软件,该软件既可以对某个文件夹(Folder)杀毒,也可以对某个指定的文件(File)进行杀毒。该杀毒软件还可以根据各类文件的特点,为不同类型的文件提供不同的杀毒方式,例如图像文件(ImageFile

01数据结构——绪论

拥有回忆 提交于 2020-03-05 14:26:16
一、数据结构绪论 1.1 数据结构 数据结构 是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。 1.2 基本概念和术语 数据 数据 是描述 客观事物 的符号,是计算机中可以 操作的对象 ,是能被计算机识别,并输入给计算机处理的 符号集合 。 数据不仅仅包括整形、实型等数值类型,还包括字符及声音、图像、视频等非数值类型。 数据元素 数据元素 是组成数据的、有一定意义的 基本单位 ,在计算机中通常作为整体处理,也被称为 记录 。 比如动物类中,牛、马、羊、鸡、鸭、鹅就是其数据元素。 数据项 一个 数据元素 可以由若干 数据项 组成。数据项是数据不可分割的 最小单位 。 比如人这样的数据元素,有眼、耳、鼻、口、手、脚这些数据项,也可以有姓名、年龄、性别、出生地址、联系电话等数据项,具体哪些数据项,要根据你的系统决定。 数据对象 数据对象 是性质相同的 数据元素的集合 ,是 数据的子集 。 所谓性质相同,是指数据元素具有相同数量和类型的数据项,比如人都有姓名,性别,生日等相同的数据项。 数据结构 数据结构 是相互之间存在 一种或多种 特定关系的 数据元素的集合 。 研究数据结构的意义: 在计算机中,数据元素不是孤立、杂乱无序的,而是具有内在联系的数据集合。数据元素之间存在的一种或多种特定关系,也就是数据的组织形式。为编写一个好的程序

二叉树,二叉树遍历,二叉树搜索

帅比萌擦擦* 提交于 2020-02-23 14:56:52
树形结构 树形结构应该就比较容易理解了,树是二维数据结构中的一种,至于说二叉树又是树的一种了。 树和图的区别在这里说明一下,重点: 树形结构为二维数据结构中的一种特殊结构 1.树形结构有一个根节点 2.树形结构没有回路(就是只能一直往下,有回路的称为图,树是图的一种) 3.树形结构我们称为 有向循环图 几个关键字,拓补结构,树,图,有向循环图 二叉树 就三种,一种根节点,一种节点,一种叶子节点 二叉树,就是只有两个枝的结构 二叉树代码实现: //二叉树结构 function Rout(value) { this.value = value; this.left = null; this.right = null; } // 赋值 var a = new Rout("a"); var b = new Rout("b"); var c = new Rout("c"); var d = new Rout("d"); var e = new Rout("e"); var f = new Rout("f"); var g = new Rout("g"); // 结构图 a.left = b; a.right = c; b.left = d; b.right = e; c.left = f; c.right = g; 跟节点应该好理解 叶子节点:下边没有其他节点 节点:既不是根节点

QTreeView将选中的树形结构复制粘贴

霸气de小男生 提交于 2020-02-21 04:27:47
首先组织QTreeView中每一项的数据结构,将要显示在QTreeView中的每一项的类定义为 class TreeItem : public QObject { Q_OBJECT public: TreeItem(const QList<QVariant> &data, QoSTreeItem *parent=0, QObject *parentObj = 0); ~QoSTreeItem(); void appendChild(QoSTreeItem *child); QoSTreeItem *child(int row); int childCount() const; int columnCount() const; QVariant data(int column) const; int row() const; QoSTreeItem *parent(); bool isChecked(); void setCheckState(bool state); void setColumnData(int column, const QVariant &data); public: bool m_checked; private: TreeItem *parentItem; // 父节点 QList<TreeItem *> childItems; // 管理孩子节点的容器

非标准树状结构数据的处理

那年仲夏 提交于 2020-02-17 17:44:34
之前笔者写过两篇博客来讲如何处理标准的树状结构数据,分别是 js遍历树形结构方法 和 过滤树形结构数据并获取新的树形结构 。这次就来聊一下如何处理非标准树状结构数据。标准的树状结构数据的下级节点存放的字段是统一的比如说我们常见的children,有一些特别的数据为了语义上更加明确,所以每一级的子级所在的字段都不一样,比如存放省市区标识的数据用cityList存放下级市,areaList存放下级的区。下面来讲一下,如何遍历这种非标准树形结构,并且如何将他们转换成标准的树状结构数据。 先来看一下我们要处理的数据结构,因为内容较多这里就只放出部分截图: 处理树状结构的方法用递归是最适合不过了。这里也顺带讲一下为什么我们不用循环嵌套的方式去遍历树形结构比如每一级的循环都用for,或者是forEach等等。主要的原因是后期难以维护和扩展,比如树状结构再新增一级,要是用for, map, forEach 等遍历,那你就得再写上一层。层级结构会越来越深,而且每一层相关的判断逻辑可能都需要重新复制一遍。如果用递归,那么他的逻辑结构是很稳定的,如果仅仅是新增了一级,递归的逻辑是仍然有效的,代码无需变动。如果需要修改判断逻辑,基本上只要在递归的主逻辑上稍微修改一下就行,数据的封装和向下传递是基本不需要动的。 处理树状结构数据考验的就是递归的功力。递归主要搞清楚两点,第一点是进入下一次递归的条件

【php设计模式】组合模式

[亡魂溺海] 提交于 2020-02-01 08:57:50
定义:   是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。 应用场景:   部分、整体场景,如树形菜单,文件、文件夹的管理 通俗解释:   组合模式,就是在一个对象中包含其他对象,这些被包含的对象可能是终点对象(不再包含别的对象),也有可能是非终点对象(其内部还包含其他对象,或叫组对象),我们将对象称为节点,即一个根节点包含许多子节点,这些子节点有的不再包含子节点,而有的仍然包含子节点,以此类推。很明显,这是树形结构,终结点叫叶子节点,非终节点(组节点)叫树枝节点,第一个节点叫根节点。同时也类似于文件目录的结构形式:文件可称之为终节点,目录可称之为非终节点(组节点)。 实现如图所示的树形结构 interface Node{ public function add(Node $node); } class Branch implements Node{ static $i = 0; public $name; public $node_list; public function __construct($name){ $this->name = $name; } public function add(Node $node){ $this->node_list[] =

C++设计模式之组合模式(composite)(结构型)

时光毁灭记忆、已成空白 提交于 2020-01-27 03:12:33
对于树形结构,当容器对象(如文件夹)的某一个方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员对象(可以是容器对象,也可以是叶子对象,如子文件夹和文件)并调用执行。(递归调用) 由于容器对象和叶子对象在功能上的区别,在使用这些对象的客户端代码中必须有区别地对待容器对象和叶子对象,而实际上大多数情况下客户端希望一致地处理它们,因为对于这些对象的区别对待将会使得程序非常复杂。 组合模式描述了如何将容器对象和叶子对象进行递归组合,使得 用户在使用时无须对它们进行区分,可以一致地对待容器对象和叶子对象,这就是组合模式 的模式动机。 一、模式定义 组合模式(Composite Pattern):组合多个对象形成树形结构以表示“整体-部分”的结构层次。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性。 组合模式又可以称为“整体-部分”(Part-Whole)模式,属于对象的结构模式,它将对象组织到树结构中,可以用来描述整体与部分的关系。 组合模式的分类 1) 安全组合模式: 将管理子元素的方法定义在 Composite 类中。 2) 透明组合模式: 将管理子元素的方法定义在 Component 接口中,这样Leaf类就需要对这些方法空实现。 适用性 • 需要表示一个对象整体或部分层次,在具有整体和部分的层次结构中,希望 通过一种方式忽略整体与部分的差异

从文件夹的角度解读算法——并查集

你说的曾经没有我的故事 提交于 2020-01-23 22:48:25
文件与并查集 1、并查集概念 2、文件与并查集的联系 (1)组合模式 (2)文件夹查询 (3)文件夹合并 3、并查集算法源码 (1)初始化 (2)查询 (3)合并 (4)路径压缩 (5)测试 1、并查集概念 根据百度百科的权威解释,并查集的定义大概如下所示: 并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。 这一类问题近几年来反复出现在信息学的国际国内赛题中,其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行时间(1~3秒)内计算出试题需要的结果,只能用并查集来描述。 并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。 2、文件与并查集的联系 (1)组合模式 说到树形结构,计算机里有一样众人皆知的东西——文件,其实就可以用树形结构来表示。 如果你上过设计模式这门课,GOF常用的23种设计模式中 结构型模式类别 中的 组合模式 ,其中有一个经典的例子讲的就是文件。 那什么是组合模式呢,我们先来看看它的定义: 组合模式,将对象组合成树形结构以表示“部分-整体

在mqsql实现树形结构查询

余生颓废 提交于 2020-01-22 12:30:57
子节点查询所有父节点 查询函数(包含自己,可以避免父节点查询无结果,以及区分传入的节点是否存在) DROP FUNCTION IF EXISTS queryParentProductCatalog ; DELIMITER ; ; CREATE FUNCTION queryParentProductCatalog ( catalogId INT ) RETURNS VARCHAR ( 21845 ) BEGIN DECLARE sTemp VARCHAR ( 21845 ) ; DECLARE sTempChd INT ; SET sTemp = catalogId ; SELECT parent_id INTO sTempChd FROM t_product_catalog WHERE catalog_id = catalogId ; IF sTempChd = 111737865 OR sTempChd = 2018036623 THEN SET sTemp = CONCAT ( sTemp , ',' , sTempChd ) ; END IF ; WHILE ( sTempChd is not NULL AND sTempChd <> 0 AND sTempChd <> 111737865 AND sTempChd <> 2018036623 ) DO SELECT

树状数组学习笔记

做~自己de王妃 提交于 2020-01-19 00:16:59
本文是笔者学完树状数组后对树状数组进行的一个学习总结,如有纰漏或者错误之处,还望读者不吝指教,不胜感激! 一、树状数组的概念: 所谓树状数组(Binary Indexed Tree),从字面意思来讲,就是用数组来模拟树形结构。也就是说它可以将线性结构转化为树形结构,从而实现跳跃式的扫描。所以它一般应用于解决动态前缀和问题。 二、树状数组一般可以解决的问题: 树状数组可以解决大部分基于区间上的更新和求和问题。但功能有限,遇到一般的复杂问题是不能解决的。 三、和线段树的区别: 所有可以用树状数组解决的问题都可以用线段树解决。但树状数组的代码复杂度明显优于线段树。所以可以使用树状数组解决的问题都可以尽量考虑用树状数组解决。(当然,神牛请随意) 四、时间复杂度和空间复杂度: 树状数组修改和查询的时间复杂度都是O(logN),空间复杂度为O(N) 下面我将从树状数组的创建到树状数组可以实现的各个功能开始逐一讲解。 1、树状数组的创建: 讲解二叉树的结构之前,我先引入二叉树的结构,如图下图所示: 这样每一个父亲节点都存的是两个子节点的值,那就可以解决一般的基于区间的查询和修改问题,但这样的树形结构是线段树,不是树状数组。所以树状数组是一个什么样的树形结构呢? 首先,我们把二叉树的结构变形一下: 之后,在删掉部分结点,如下图所示: 黑色数组表示原来的数组A[i],红色代表树状数组C[i],看上图