
数据结构基础
Qiuery
好好学习,天天向上。为自己代言,做想要的自己。因为无知,所以挑战,因为挑战,所有了解,因为了解,所以理智,因为理智,所以成熟。试了才知道,潜力在于挖掘。
展开
-
数据结构 笔记:最短路径(Floyd)
问题的提法-已知一个各边权值均大于0的带权有向图,对每一对顶点Vi≠Vj,求出Vi与Vj之间的最短路径值以及最短路径上的顶点。Floyd算法核心n阶方阵中元素的意义-A^-1[i][j]:Vi到Vj的权值,无中间顶点-A^0[i][j]:Vi到Vj的路径长度,路径的中间顶点为0-A^1[i][j]:Vi到Vj的路径长度,路径的中间顶点可能为0或1-……-A^k[...原创 2018-12-03 17:40:54 · 340 阅读 · 0 评论 -
数据结构 笔记:树中结点的插入操作
插入的方式-插入新结点·bool insert(TreeNode<T>* node)-插入数据元素·bool insert(const T& value,TreeNode<T>* parent)如何指定新结点在树里面的位置插入新结点之前,必须先找到前驱结点bool insert(TreeNode<T>* node) ...原创 2018-11-12 16:04:34 · 1802 阅读 · 0 评论 -
数据结构 笔记:树中结点的查找操作
查找的方式-基于数据元素值的查找·GTreeNode<T>* find(const T& value) const-基于结点的查找·GTreeNode<T>* find(TreeNode<T>* node) const基于数据元素值的查找-定义功能:find(node,value)·在node为根节点的树中查找value所在的...原创 2018-11-12 14:08:33 · 1485 阅读 · 0 评论 -
数据结构 笔记:二叉树的存储结构设计
设计要点-BTree为二叉树结构,每个结点最多只有两个后继结点-BTreeNode只包含4个固定的共有成员(哪4个?)-实现树结构的所有操作(增,删,查,等)BTreeNode的设计与实现template <typename T>class BTreeNode : public TreeNode<T>{public: BTreeNode&...原创 2018-11-14 10:50:22 · 614 阅读 · 0 评论 -
数据结构 笔记:树的存储结构与实现
树的结点的存储结构GTreeNode的设计与实现template<typename T>class GTreeNode : public TreeNode<T>{public: LinkList<GTreeeNode<T>*> child;};GTree的设计与实现template<typename T&...原创 2018-11-12 11:27:57 · 299 阅读 · 0 评论 -
数据结构 笔记:树的定义与操作
树是一种非线性的数据结构树是由n(n>=0)个结点组成的有限集合-如果 n = 0,成为空树;-如果n > 0,则:·有一个特定的称之为根(root)的结点·根据点只有直接后继,但没有直接前驱·除根以外的其他结点划分为m(m>=0)个互补相交的有限集合T0,T1,...,Tm-1,每个集合又是一棵树,并称之为根的子树(sub tree)树中度的...原创 2018-11-12 10:09:22 · 499 阅读 · 0 评论 -
数据结构 笔记:二叉树的比较与相加
二叉树的克隆操作-SharedPointer<BTree<T>> clone() const·克隆当前树的一份拷贝·返回值为堆空间中的一棵新二叉树(与当前树相等)二叉树的克隆-定义功能:clone(node)·拷贝node为根节点的二叉树(数据元素在对应位置相等)BTreeNode<T>* clone(BTreeNode<T&...原创 2018-11-15 17:55:42 · 1001 阅读 · 0 评论 -
数据结构 笔记:二叉树的典型遍历方式
二叉树是否只有一种遍历方式(层次遍历)?典型的二叉树遍历方式-先序遍历(Pre-Order Traversal)-中序遍历(In-Order Traversal)-后序遍历(Post-Order Traversal)先序遍历(Pre-Order Traversal)-二叉树为空:·无操作,直接返回-二叉树不为空:1.访问结点中的数据元素2.先序遍历左子树...原创 2018-11-15 15:31:26 · 172 阅读 · 0 评论 -
数据结构 笔记:二叉树的深层特性
性质1-在二叉树的第i层最多有个2^(i-1)个结点。(i>=1)性质2高度为k的二叉树最多有2^k-1个结点。(k>=0)性质3对任何一棵二叉树,如果其叶节点有N0个,度为2的非叶节点有n2个,则有n0 = n2 + 1.性质4具有n个结点的完全二叉树的高度为log2n+1性质5一棵有n个结点的二叉树(高度为log2n+1),按层次对结点进行编号(...原创 2018-11-13 17:35:19 · 154 阅读 · 1 评论 -
数据结构 笔记:树到二叉树的转换
通用树结构的回顾-双亲孩子表示法·每个结点都有一个指向其双亲的指针·每个结点都有若干个指向其孩子的指针另一种属性结构模型-孩子兄弟表示法·每个节点都有一个指向其第一个孩子的指针·每个节点都有一个指向其第一个右兄弟的指针孩子兄弟表示法的特点-能够表示人意的树形结构-每个结点包含一个数据成员和两个指针成员-孩子结点指针和兄弟结点指针构成了“树杈”二叉树的...原创 2018-11-13 16:52:04 · 520 阅读 · 0 评论 -
数据结构 笔记:树形结构的层次遍历
如果按层次遍历通用树结构中的每一个数据元素?当前的事实-树是非线性的数据结构,树的结点没有固定的编号方式新的需求-为通用树机构提供新的方法,快速遍历每一个结点设计思路(游标)-在树中定义一个游标(GTreeNode<T>*)-遍历开始前将游标指向根节点(root())-获取游标指向的数据元素-通过结点中的child成员移动游标设计思路(游标)...原创 2018-11-13 15:47:20 · 2697 阅读 · 0 评论 -
数据结构 笔记:树中属性操作的实现
树中结点的数目-定义功能:count(node)·在node为根结点的树中统计结点的数目int count(GTreeNode<T>* node) const { int ret = 0; if(node != NULL) { ret = 1; for(node-&...原创 2018-11-13 11:50:04 · 184 阅读 · 0 评论 -
数据结构 笔记:树中结点的删除操作
删除的方式-基于数据元素值的删除·SharedPointer<Tree<T>>remove(const T& value)-基于结点的删除·SharedPointer<Tree<T>> remove(TreeNode<T>* node)删除操作成员函数的设计要点-将被删除结点所代表的子树进行删除-删除函...原创 2018-11-13 10:52:24 · 1144 阅读 · 0 评论 -
数据结构 笔记:归并排序和快速排序
归并排序的基本思想-将两个或两个以上的有序序列合并成一个新的有序序列 template < typename T> static void Merge(T src[] , T helper[],int begin,int mid,int end, bool min2max = true) { int i = begin; ...原创 2018-11-09 15:08:54 · 170 阅读 · 0 评论 -
数据结构 笔记:二叉树中的结点查找操作
查找的方式-基于数据元素值的查找·BTreeNode<T>* find(const T& value) const-基于结点的查找·BTreeNode<T>* find(TreeNode<T>* node) const基于数据元素值的查找-定义功能:find(node,vlaue)·在node为根结点的二叉树中查找value所...原创 2018-11-14 11:32:35 · 2961 阅读 · 1 评论 -
数据结构 笔记:树节点中的清除操作
清除操作的定义-void clear()·将树中的所有结点清除(释放堆中的结点)清除操作功能的定义-free(node)·清除node为根结点的树·释放树中的每一个结点树中的结点可能来源于不用存储空间,如何判断堆空间的结点并释放?-单凭内存地址很难准确判断具体的存储区域-只有堆空间内存需要主动释放(delete)-清楚操作时只需要对堆中的结点进行释放工厂...原创 2018-11-12 17:40:33 · 835 阅读 · 0 评论 -
数据结构 笔记:最短路劲
最短路劲的概念如果从有向图中某一顶点(起始顶点)到达另一顶点(终止顶点)的路劲不止一条,那么如何找到一条路径不止一条,那么如何找到一条路径使得此路径各边上的权值总和达到最小?问题的提法:-给定一个带权有向图G与起始顶点v,求从v到G中其他顶点的最短路径(每条边上都存在有意义的权值)解决思路-Dijkstra提出按路径长度的递增次序,逐步产生最短路径·首先求出长度最短的一...原创 2018-12-03 14:20:31 · 289 阅读 · 0 评论 -
数据结构 笔记:最小生成树(Kruskal)
最小生成树的特征:-选取的边是图中权值较小的边-所有边连接后不构成回路既然最小生成树关心的是如何选择n-1条边,那么是否可以直接以边为核心进行算法设计?-由4个顶点构成图,选择3条权值最小的边如何判断新选择的边与已选择的边是否构成回路?技巧:前驱标记数组-定义数组:Array<int> p(vCount());-数组元素的意义:·p[n]表示顶点n在...原创 2018-11-30 17:27:29 · 353 阅读 · 0 评论 -
数据结构 笔记:最小生成树(prim)
运营商的挑战-在下图标出的城市间架设一条通信线路要求:·任意两个城市间都能够通信·将架设成本呢将至最低 如何在图中选择n-1条边使得n个顶点间两两可达,并且这n-1条边的权值之和最小最小生成树-仅使用图中的n-1条边连接图中的n个顶点-不能使用产生回路的边-个边上的权值的总和达到最小最小生成树算法步骤-选择某一顶点V0作为起始顶点,是的T={...原创 2018-11-30 14:39:48 · 249 阅读 · 0 评论 -
数据结构 笔记:最长不下降序列
不下降序列问题设由n个数组成的数列,记为:a[1]、a[2]、……、a[n],若存在i1 < i2 <... im 满足:a[i1] <= a[i2] <= .... <= a[im] , 则称为长度为m的不下降序列。则:》 3,18,23,24是一个长度为4的不下降序列》 3,7,10,12,16,24是一个长度为6的不下降序列问题:如何...原创 2018-12-04 14:37:02 · 330 阅读 · 0 评论 -
数据结构 笔记:图的遍历(DFS)
深度优先(DFS)深度优先算法-原料:class LinkStack<T>;-步骤:-将起始顶点压入栈中-弹出栈顶顶点v,判断是否已经标记(标记:转2,为标记:转3)-标记顶点v,并将顶点v的邻接顶点压入栈中-判断栈是否为空(非空:转2,空:结束)深度优先算法示例 SharedPointer<Array<int>>...原创 2018-11-29 17:52:48 · 698 阅读 · 0 评论 -
数据结构 笔记:图的存储结构
基本思想-用一维数组存储顶点:描述顶点相关的数据-用二维数组存储边:描述顶点间的关系和权邻接矩阵法-设图A = (V,E)是一个有n个顶点的图,图的邻接矩阵为Edge[n][n],则:Edge[i][i] = w,w权值,i和j连接;空,i == j或i 和j不连接 注:解决工程问题时,习惯于对图中的每个顶点进行编号,当不需要权值时,去w非空表示结点间的有连接邻接矩阵法...原创 2018-11-29 11:49:40 · 391 阅读 · 0 评论 -
数据结构 笔记:图的遍历(BFS)
时间复杂度的对比分析 MatrixGraph ListGraph addVertex - O(n) removeVertex - O(n^2) getVertex O(1) O(n) setVertex O(1) O(n) getAdjacent O(n) O(n) getEdge O(1)...原创 2018-11-29 16:28:59 · 290 阅读 · 0 评论 -
数据结构 笔记:图的定义与操作
定义-图是由顶点集合(Vertex)及顶点间的关系集合(Edge)组成的一种数据结构-Graph = (V,E)-V= 是顶点的有穷非空集合-E=是顶点之间关系的有穷集合无向边-顶点x和y之间的边没有方向,则称该边为无向边-<x,y> 与<y,x>意义不同·<x,y>表示从x连接到y,x成为尾,y成为头·<y,x>...原创 2018-11-19 15:30:27 · 240 阅读 · 0 评论 -
数据结构 笔记:二叉树结构的层次遍历
二叉树的遍历-二叉树的遍历(Traversing Binay Tree)是指从根节点触发,按照某种次序一次访问二叉树中的所有结点,使得每个结点被访问一次,且仅被访问一次。通用树结构的层次遍历算法是否可以用在二叉树结构上?如果可以,代码需要做怎样的改动?提供一组遍历相关的函数,按层次访问二叉树中的数据元素。函数 功能说明 begin() 初始化,准备进行遍历访问...原创 2018-11-15 11:52:40 · 407 阅读 · 0 评论 -
数据结构 笔记:二叉树中属性操作的实现
二叉树的属性操作count() = 10;height() = 4;degree() = 2;二叉树结点的数目-定义功能:count(node)·在node为根结点的二叉树中统计结点数目int count(BTreeNode<T>* node)const { return (node != NULL)?(count(node-&...原创 2018-11-15 10:01:50 · 346 阅读 · 0 评论 -
数据结构 笔记:二叉树的线索化实现
什么是线索化二叉树?-将二叉树转换为双向链表的过程(非线性 -> 线性)-能够反映某种二叉树的遍历次序(结点的先后访问次序)·利用结点的right指针指向遍历中的后继结点·利用结点的left指针指向遍历中的前驱结点目标-新增功能函数 traversal(order,queue)-新增遍历方式BTTraversal::LevelOrder;-新增公有函数BTre...原创 2018-11-16 16:04:05 · 377 阅读 · 0 评论 -
数据结构 笔记:二叉树中的结点删除与清除
删除的方式-基于数据元素值的删除·SharedPointer<Tree<T>>remove(const T& value)-基于结点的删除·SharedPointer<Tree <T>>remove(TreeNode<T>* node)删除操作功能的定义-void remove(BTreeNode<T...原创 2018-11-14 17:54:29 · 1344 阅读 · 0 评论 -
数据结构 笔记:二叉树中的结点插入操作
是否能够在二叉树的而已结点出插入子结点?-不能,二叉树结点的每个结点的子结点是固定的,只存在左孩子和右孩子.是否需要指定新数据元素(新结点)的插入位置?-需要指定为左孩子或者右孩子enum BTNodePos{ ANY, LEFT, RIGHT};插入的方式-插入新结点·bool insert(TreeNode<T>* node...原创 2018-11-14 16:08:21 · 2751 阅读 · 0 评论 -
数据结构 笔记:冒泡排序和希尔排序
冒泡排序的基本思想-每次从后向前进行(假设为第i次),j = n -1 ,n- 2,...,i,两辆比较 V[j-1]和V[j]的关键字;如果发生逆序,则交换V[j-1]和V[j].template <typename T> static void Bubble(T array[], int len, bool min2max = true) { ...原创 2018-11-09 11:24:06 · 297 阅读 · 0 评论 -
数据结构 笔记:选择排序和插入排序
选择排序的基本思想-每次(例如底 i 次,i = 0 ,1,...,n-2)从后面n-i个待排的数据元素中选出关键字最小的元素,作为有序元素序列底 i 个元素.template <typename T> static void Select(T array[] , int len,bool min2max = true) { for(int i...原创 2018-11-06 18:00:22 · 180 阅读 · 0 评论 -
数据结构 笔记:顺序表和单链表的对比分析
如何判断某个数据元素是否存在于线性表中?find-可以为线性表(List)增加一个查找操作-int find(const T& e)const;·参数:~待查找的数据元素·返回值:~>= 0:数据元素在线性表中第一次出现的位置~-1:数据元素不存在数据元素查找示例LinkList<int> list;for(int i=0;i...原创 2018-10-17 10:49:23 · 449 阅读 · 0 评论 -
数据结构 笔记:单链表的具体实现
LinkList设计要点-类模板,通过头结点访问后继结点-定义内部结点类型Node,用于描述数据域和指针域-实现线性表的关键操作(增,删,查,等)template<typename T>class LinkList : public List<T>{protected: struct Node :public Object { ...原创 2018-10-16 18:18:51 · 154 阅读 · 0 评论 -
数据结构 笔记:线性表的链式存储结构
链式存储的定义为了表示每个数据元素与其直接后继元素之间的逻辑关系;数据元素出了存储本身的信息外,还需要存储直接后继的信息。ps:在逻辑上,元素之间是相邻的;在物理内存中元素之间并无相邻关系。链式存储逻辑结构-基础链式存储结构的线性表中,每个节点都包含数据域和指针域·数据域:存储数据元素本身·指针域:存储相邻结点的地址专业术语的统一-顺序表基于顺序存储结构的线性表...原创 2018-10-16 14:25:27 · 371 阅读 · 0 评论 -
数据结构 笔记:数组类的创建
需求分析-创建数组类代替原生数组的使用·数组类包含长度信息·数组类能够主动发现越界访问Array设计要点-抽象类模板,存储空间的位置和大小由子类完成-重载数组操作符,判断访问下标是否合法-提供数组长度的抽象访问函数-提供数组对象间的复制操作Array类的声明template <typename T>class Array : public O...原创 2018-10-16 11:12:23 · 167 阅读 · 0 评论 -
数据结构 笔记:顺序存储结构的抽象实现
SeqList设计要点-抽象类模板,存储空间的位置和大小由子类完成-实现顺序存储结构线性表的关键操作(增,删,查,等)-提供数组操作符,方便快速获取元素template <typename T>class SeqList : public List<T>{protected: T* m_array; //顺序存储空间 int m...原创 2018-10-15 17:10:55 · 197 阅读 · 0 评论 -
数据结构 笔记:线性表的顺序存储结构
顺序存储的定义线性表的顺序存储结构,指的是用一段地址连续的存储单元一次存储线性表中的数据元素。顺序存储结构的元素插入操作-判断目标位置是否合法-将目标位置之后的所有元素后移一个位置-将新元素插入目标位置-线性长度加1顺序存储结构的元素插入示例bool SeqList<T>::insert(int i,cosnt T& e){ bool...原创 2018-10-15 16:28:13 · 168 阅读 · 0 评论 -
数据结构 笔记:线性表的本质和操作
线性表(List)的表现形式-零个或多个数据元素组成的集合-数据元素在位置上是有序排列的-数据元素的个数是有限的-数据元素的类型必须相同线性表(List)的抽象定义线性表是具有相同类型的n( >= 0)个数据元素的有限序列线性表(List)的性质-a0为线性表的第一个元素,制作一个后继-an-1为线性表的最后一个元素,只有一个钱驱-除a0和an-1外的...原创 2018-10-15 14:49:19 · 148 阅读 · 0 评论 -
数据结构 笔记:循环链表的实现
什么事循环链表?-概念上·任意数据元素都有一个前驱和一个后继·所有的数据元素的关系构成一个逻辑上的环-实现上·循环链表是一种特殊的单链表·尾结点的指针域保存了首结点的地址循环链表的实现思路-通过模板定义CircleList类,继承自LinkList类-定义内部函数last_to_first(),用于将单链表首尾相连-特殊处理:首元素的插入操作和删除操作...原创 2018-10-18 16:30:11 · 240 阅读 · 0 评论 -
数据结构 笔记:SharedPointer类实现
使用智能指针(SmartPointer)替换单链表(LinkList)中的原生指针是否可行?问题-SmartPointer的设计方案·指针声明周期结束时主动释放堆空间·一片堆空间最多只能由一个指针标识·杜绝指针运算和指针比较新的设计方案-Pointer是智能指针的抽象父类(模板)·纯虚析构函数virtual ~Pointer() = 0;·重载operato...原创 2018-10-18 14:31:50 · 859 阅读 · 0 评论