数据结构
文章平均质量分 77
xiebs_
我对不起唐老师
展开
-
复习数据结构
数据结构原创 2022-06-15 23:34:21 · 98 阅读 · 0 评论 -
C++数据结构第67课、二叉树的典型遍历方式
典型的二叉树遍历方式:— 先序遍历— 中序遍历— 后序遍历先序遍历:— 二叉树为空,则直接返回;— 二叉树不为空:1、访问根结点中的数据元素2、先序遍历左子树3、先序遍历右子树中序遍历:— 二叉树为空,则直接返回— 二叉树不为空:1、中序遍历左子树2、访问根结点中的数据元素3、中序遍历右子树后序遍历:— 二叉树为空,则直接返回;— 二叉树不为空:1、后序遍历左子树2、后序遍历右子树3、访问根结点中的数据元素我们可以将二叉树的典型遍历算法集成到 BT.原创 2020-08-28 09:42:50 · 148 阅读 · 0 评论 -
C++数据结构第66课、二叉树结构的层次遍历
二叉树的遍历二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次,且仅被访问一次。设计思路(游标):提供一组遍历相关的函数,按层次访问二叉树中的数据元素层次遍历算法:— 原料:class LinkQueue<T>— 游标:LinkQueue<T>::front()— 思想1、begin() --> 将根结点压入队列中2、current() --> 访问队头元素指向的数据元素3、next() --> 队头.原创 2020-08-28 09:12:10 · 226 阅读 · 0 评论 -
C++数据结构第65课、二叉树中属性操作的实现
在二叉树中,它的属性操作有三种:1、结点数目;2、高度;3、度数。二叉树中结点的数目定义功能 count(node):在 node 为根结点的二叉树中统计结点数目二叉树的高度定义功能:height(node):获取 node 为根结点的二叉树的高度二叉树的度数定义功能:degree(node):获取 node 为根结点的二叉树的度数...原创 2020-08-27 22:23:06 · 127 阅读 · 0 评论 -
C++数据结构第64课、二叉树中的结点删除与清除
删除的方式— 基于数据元素值的删除:SharedPointer< Tree<T> > remove(const T& value)— 基于结点的删除:SharedPointer< Tree<T> > remove(TreeNode<T>* node)二叉树中结点的删除删除操作功能的定义— virtual void remove(BTreeNode<T>* node, BTree<T>*& ret.原创 2020-08-27 21:30:34 · 1040 阅读 · 0 评论 -
C++数据结构第63课、二叉树中的结点插入操作
我们在进行插入操作的时候不是二叉树的任意结点都能插入,必须得指明插入新结点的位置,是左子树还是右子树,如果不指明便是默认从左向右的进行插入。因此我们得定义一个枚举,用来表示二叉树结点的位置。插入操作分为两种:— 插入新结点bool insert(TreeNode<T>* node)bool insert(TreeNode<T>* node, BTNodePos pos)— 插入数据元素bool insert(const T& value, TreeNode..原创 2020-08-27 16:50:29 · 2032 阅读 · 0 评论 -
C++数据结构第62课、二叉树中的结点查找操作
查找操作的方式— 基于数据元素值的查找:BTreeNode<T>* find(const T& value) const— 基于结点的查找:BTreeNode<T>* find(TreeNode<T>* node) const基于数据元素值的查找— 定义功能:find(node, value) 在 node 为根结点的二叉树中查找 value 所在的结点基于结点的查找定义功能:find(node, obj) 在 node 为根结点的二叉树中查.原创 2020-08-27 16:29:23 · 648 阅读 · 0 评论 -
C++数据结构第61课、二叉树的存储结构设计
二叉树的组成结构:设计要点:— BTree 为二叉树结构,每个结点最多只有两个后继结点— BTreeNode 只包含 4 个固定的公有成员(左树、右树、构造函数、工厂模式创建新结点函数)— 实现树结构的所有操作(增、删、查等)...原创 2020-08-26 21:18:46 · 187 阅读 · 0 评论 -
C++数据结构第60课、二叉树的深层特性
二叉树的几个性质:原创 2020-08-26 21:16:52 · 113 阅读 · 0 评论 -
C++数据结构第59课、树到二叉树的转换
通用树的回顾:双亲孩子表示法— 每个结点都有一个指向其双亲的指针— 每个结点都有若干个指向其孩子的指针另一种树结构模型:孩子兄弟表示法— 每个结点都有一个指向其第一个孩子的指针— 每个结点都有一个指向其第一个右兄弟的指针孩子兄弟表示法的特点:1、能够表示任意的树形结构2、每个结点包含一个数据成员和两个指针成员3、孩子结点指针和兄弟结点指针构成了 “树杈”二叉树的定义:二叉树是由 n ( n >= 0 ) 个结点组成的有限集合,该集合或者为空,或者是由一个根结点加上两颗 分别称为原创 2020-08-26 20:27:45 · 967 阅读 · 0 评论 -
C++数据结构第58课、树形结构的层次遍历
问题:如何按层次遍历通用树结构中的每一个数据元素?树是非线性的数据结构,树的结点没有固定的编号方式新的需求:为通用树结构提供新的方法,能快速遍历每一个结点设计思路(游标):1、在树中定义一个游标GTreeNode<T>*2、遍历开始前将游标指向根结点 root()3、获取游标指向的数据元素4、通过结点中的 child 成员移动游标提供一组遍历相关的函数,按层次访问树中的数据元素层次遍历算法:— 原料:class LinkQueue;— 游标:LinkQueue::fr原创 2020-08-25 16:48:35 · 342 阅读 · 0 评论 -
C++数据结构第57课、树中属性操作的实现
1、 树中结点的数目功能定义:count(node) 在 node 为根结点的树中统计结点数目树的结点数目的计算示例:2、树的高度功能定义:height(node):获取 node 为根结点的树的高度树的高度计算示例:3、树的度数功能定义:degree(node):获取 node 为根结点的树的度数树的度计算示例:...原创 2020-08-25 16:20:54 · 134 阅读 · 0 评论 -
C++数据结构第56课、树中结点的删除操作
树中结点的删除操作:删除的方式:— 基于数据元素值的删除:SharedPointer< Tree<T> > remove(const T& value)— 基于结点的删除:SharedPointer< Tree<T> > remove(TreeNode<T>* node)删除操作成员函数的设计要点:1、将被删结点所代表的子树进行删除2、删除函数返回一颗堆空间的树3、具体返回值为指向树的智能指针对象实用的设计原则:当需要原创 2020-08-25 10:44:17 · 592 阅读 · 0 评论 -
C++数据结构第55课、树中结点的清除操作
1、 清除操作的定义:将树中的所有结点清除(释放堆中的结点)void clear()树中数据元素的清除清除操作功能的定义— free(node):清除 node 为根结点的树,释放树中的每一个结点原创 2020-08-24 22:39:24 · 723 阅读 · 0 评论 -
C++数据结构第54课、树中结点的插入操作
插入的方式应分为两种:— 插入新结点:bool insert(TreeNode<T>* node)— 插入数据元素:bool insert(const T& value, TreeNode<T>* parent)如何在树中指定新结点的位置?— 树是非线性的,无法采用下标的形式定位数据元素— 每一个树结点都有唯一的前驱结点(父结点)— 因此,必须先找到前驱节点,才能完成新结点的插入插入新结点的流程:插入数据元素流程:...原创 2020-08-24 20:34:05 · 1022 阅读 · 0 评论 -
C++数据结构第53课、树中结点的查找操作
查找的方式— 基于数据元素值的查找:GTreeNode<T>* find(const T& value) const— 基于结点的查找:GTreeNode<T>* find(TreeNode<T>* node) const1、基于数据元素值的查找:在 protected 属性中定义 find(node, value) 功能,在 node 为根结点的树中查找 value 所在的结点2、基于结点的查找:在 protected 属性中定义 find(no.原创 2020-08-24 16:47:51 · 576 阅读 · 0 评论 -
C++数据结构第52课、树的存储结构与实现
课程目标:完成树和结点的存储结构设计设计要点:1、GTree 为通用树结构,每个结点可以存在多个后继结点;2、GTreeNode 能够包含任意多指向后继结点的指针;3、实现树结构的所有操作(增,删,查,等)。...原创 2020-08-22 22:43:19 · 361 阅读 · 0 评论 -
C++数据结构第51课、树的定义与操作
1、树的定义与操作:树是一种非线性的数据结构,树是由 n( n >= 0 ) 个结点组成的有限集合。— 如果 n= 0,称为空树;— 如果 n > 0,则:1、有一个特定的称之为根(root)的结点;2、根结点只有直接后继,但没有直接前驱;3、除根以外的其它结点划分为 m( m >= 0 ) 个互不相交的有限集合T0, T1, … Tm-1,每个集合又是一棵树,并且称之为根的子树(sub tree)。2、树中度的概念— 树的结点包含一个数据及若干指向子树的分支— 结点拥有子树的原创 2020-08-22 22:37:13 · 904 阅读 · 0 评论 -
C++数据结构第49课、归并排序和快速排序
1、归并排序:将两个或两个以上的有序序列合并成一个新的有序序列。如下原创 2020-08-21 11:51:38 · 157 阅读 · 0 评论 -
C++数据结构第48课、冒泡排序和希尔排序
什么是冒泡排序呢?它是每次从后向前进行(假设为第 i 次),j = n - 1, n - 2, … , i, 两两比较 V[j-1] 和 V[j] 的关键字;如果发生逆序,则交换 V[j-1] 和 V[j]。下来我们看看第 i 次冒泡排序示例,如下图所示...原创 2020-08-21 11:50:39 · 132 阅读 · 0 评论 -
C++数据结构第47课、选择排序和插入排序
1、选择排序:它的基本思想是每次(例如第 i 次,i = 0, 1, …, n-2)从后面 n-i 个待排的数据元素中选出关键字最小的元素,作为有序元素序列第 i 个元素。第 i 次选择排序示例如下原创 2020-08-21 11:49:48 · 158 阅读 · 0 评论 -
C++数据结构第46课、排序的基本概念
排序是计算机内部经常进行的一种操作,其目的是将一组“无序”的数据元素调整为“有序”的数据元素。那么排序的数学定义时什么呢?如下原创 2020-08-21 11:48:25 · 189 阅读 · 0 评论 -
C++数据结构第44课、递归的思想与应用(中)
1、原创 2020-08-20 10:33:21 · 107 阅读 · 0 评论 -
C++数据结构第43课、递归的思想与应用(上)
问题:如何在目标字符串 S 中,查找是否存在子串 P朴素算法:原理在于一个一个进行比对自己写的:int String::index(const char* s)const{ int ret = -1; int len = strlen( s ? s : ""); for(int i = 0; (ret < 0) && i < (m_length - len + 1); i++) { int tem = 0; .原创 2020-08-20 09:17:32 · 121 阅读 · 0 评论 -
C++数据结构第42课、KMP算法的应用
1原创 2020-08-19 15:38:09 · 146 阅读 · 0 评论 -
C++数据结构第41课、KMP子串查找算法
问题:如何在目标字符串 S 中,查找是否存在子串 P朴素算法:原理在于一个一个进行比对String& insert(int i, const char* s);int String::index(const char* s)const{ int ret = -1; int len = strlen( s ? s : ""); for(int i = 0; (ret < 0) && i < (m_length - len + 1);.原创 2020-08-18 19:48:40 · 746 阅读 · 1 评论 -
C++数据结构第40课、字符串类的创建(下)
字符串类的常用成员函数重载数组访问操作符 [ ]char& operator [] (int i); char operator [] (int i) const; 注意事项:当 i 的取值不合法时,抛出异常,合法的范围是 (0 <= i) && (i < m_length)char& operator [](int i);char operator [](int i)const;char& String::operator [.原创 2020-08-18 10:22:27 · 264 阅读 · 0 评论 -
C++数据结构第39课、字符串类的创建(上)
历史遗留问题— C 语言中不支持真正意义上的字符串;— 它用字符数组和一组函数实现字符串操作;— C 语言是不支持自定义类型的,因此无法获得字符串类型。字符串类的创建— 从 C 到 C++ 的进化过程中引入了自定义类型,— 在 C++ 中可以通过类完成字符串类型的定义。问题:在 C++ 中的原生类型系统是否包含字符串类型呢?XiebsLib 库中字符串类的设计,结构如下图所示实现时的注意事项— 无缝实现 String 对象与 char* 字符串的互操作;— 操作符重..原创 2020-08-17 20:43:30 · 439 阅读 · 0 评论 -
C++数据结构第38课、两个有趣的问题
问题1:是否可以用栈实现队列?:用栈实现队列等价于用“后进先出”的特性实现“先进先出”的特性!解决方案:可以用两个栈进行实现实现思路:准备用两个栈来实现队列:stack_in 和 stack_out1、当有新元素入队时:将其压入 stack_in;2、当需要出队时:— stack_out.size() == 0 时,将 stack_in 中的元素逐一弹出并压入 stack_out,再将 stack_out 的栈顶元素弹出;— stack_out.size() > 0 时,将 stack原创 2020-08-17 15:09:09 · 124 阅读 · 0 评论 -
C++数据结构第37课、队列的概念及实现(下)
1原创 2020-08-17 10:44:17 · 109 阅读 · 0 评论 -
C++数据结构第36课、队列的概念及实现(上)
今天我们来学习下队列。那么什么是队列呢?队里是一种特殊的线性表,队列仅能在线性表的两端进行操作;队头(Front)是取出数据元素的一端,队尾(Rear)是插入数据元素的一端。队列的特性是先进先出(First in first out),关系图如下所示...原创 2020-08-17 10:43:47 · 195 阅读 · 0 评论 -
C++数据结构第35课、栈的概念及实现(下)
1原创 2020-08-16 17:38:55 · 159 阅读 · 0 评论 -
C++数据结构第34课、栈的概念及实现(上)
1、原创 2020-08-16 17:38:23 · 254 阅读 · 0 评论 -
C++数据结构第33课、双向循环链表的实现
#ifndef DUALCIRCLELIST_H#define DUALCIRCLELIST_H#include "LinuxList.h"#include "DualLinkList.h"namespace DTLib{template < typename T >class DualCircleList : public DualLinkList<T>{protected: struct Node : public Object {原创 2020-08-16 17:36:44 · 104 阅读 · 0 评论 -
C++数据结构第32课、Linux 内核链表分析
上篇博客中,我们讲到了 Linux 中的宏定义 offsetof 与 container_of 宏。那么本节我们的课程目标就是移植 Linux 内核链表,使其适用于非 GNU 编译器,分析 Linux 内核中链表的基本实现。1、Linux 内核链表的位置及依赖— 位置:{linux-2.6.39}\\include\linux\list.h— 依赖:#include <linux/types.h> #include <linux/stddef.h>#includ原创 2020-08-16 17:33:16 · 214 阅读 · 1 评论 -
C++数据结构第31课、Linux 宏定义之 offsetof 与 container_of
今天我们来看看 Linux 中的两个经典的宏:offsetof 与 container_of。下面我们先来看看它们两个的宏定义,如下#ifndef offsetof#define offsetof(TYPE, MEMBER) ((size_t)&((TYPE*)0)->MEMBER)#endif#ifndef container_of#define container_of(ptr, type, member) ({ \ const原创 2020-08-16 15:45:03 · 324 阅读 · 0 评论 -
C++数据结构第30课、双向链表的实现
1、交流的问题原创 2020-08-15 21:48:53 · 118 阅读 · 0 评论 -
C++数据结构第29课、循环链表的实现
什么是循环链表原创 2020-08-14 14:22:41 · 324 阅读 · 0 评论 -
C++数据结构第28课、再论智能指针(下)
课程目标— 完成 SharedPointer 类的具体实现SharedPointer 类的设计要点SharedPointer 类的声明智能指针的比较由于SharedPointer支持多个对象同时指向一片堆空间,因此必须支持比较操作SharedPointer.h#ifndef SHAREDPOINTER_H#define SHAREDPOINTER_H#include "Pointer.h"#include "Exception.h"#include "cstdlib"na.原创 2020-08-10 15:48:29 · 122 阅读 · 0 评论 -
C++数据结构第27课、再论智能指针(上)
思考使用智能指针SmartPointer代替单链表LinkList中的原生指针是否可行?问题出在哪里新的设计方案Pointer.h#ifndef POINTER_H#define POINTER_H#include "Object.h"namespace DTLib{template<typename T>class Pointer : public Object{protected: T* m_pointer;public: Poin.原创 2020-08-10 15:47:37 · 134 阅读 · 0 评论