数据结构
Wan_shibugong
这个作者很懒,什么都没留下…
展开
-
时间复杂度
1、概念时间复杂度之大O渐进表示法定义:一个算法语句总的执行次数是关于问题规模N的某个函数,记为f(N),N称为问题的规模。语句总的执行次数记为T(N),当N不断变化时,T(N)也在变化,算法执行次数的增长和f(N)的增长速率相同。则有T(N)=O(f(N)),称O(f(N))为时间复杂度的O渐进表示法。2、常见时间复杂度计算以下函数语句总执行次数与问题规模n的函数表达式:即时间复...原创 2018-04-10 03:14:29 · 353 阅读 · 0 评论 -
二叉树的镜像
递归的方法非递归的方法 镜像(递归) 1、如果当前的结点的不为空且左右结点存在,交换左右结点 2、然后以左节点为当前结点执行1步骤 3、然后以右结点为当前结点执行1步骤void MirrorBinTree(pBTNode pRoot){ if(pRoot) { pBTNode p = pRoot->_pLeft; p...原创 2018-05-07 21:00:26 · 278 阅读 · 0 评论 -
二叉树的操作
本程序对二叉树进行操作二叉树的建立二叉树的遍历前序遍历(递归)中序遍历(递归)后序遍历(递归)层序遍历前序遍历(非递归)二叉树的复制二叉树的销毁二叉树的结点的个数二叉树叶子结点的数二叉树层数二叉树第k层结点数二叉树的镜像(递归)二叉树的镜像(非递归)次程序使用到了队列和栈,点击查看队列和栈的...原创 2018-05-08 03:21:20 · 475 阅读 · 0 评论 -
堆的基本操作
什么是堆堆是一个数据结构的统称,堆通常是一个可以被看做一棵树的数组对象。满足下列性质堆中某个节点的值总是不大于或不小于其父节点的值堆总是一棵完全二叉树将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。大堆: 任意一个结点的值关键码(值)均大于等于它的左右孩子的关键码(值),位于对顶结点的关键码最大,从根节点到每个结点的路径上数组元素组成的序列都是递减的。 ...原创 2018-05-15 10:50:42 · 375 阅读 · 0 评论 -
优先级队列(使用堆进行封装)
优先级队列 优先队列是一种数据结构,能够保证每次出队的是队列中优先级最高的元素(可以自己定义比较器),使用堆的堆顶元素维护这个优先级最高的元素,因为堆具有堆序性,堆顶元素要么是最小的,要么是最大的。代码实现 使用到的堆 //PriorityQueue.h#include "Heap.h"typedef struct PriorityQueue{ Heap _hp;}P...原创 2018-05-15 11:06:49 · 511 阅读 · 0 评论 -
堆的应用----Top K问题
海量数据Top K 问题100亿个数据中找出最大的前K个数,我们可以遍历K次,但是时间复杂度太大为O(KN),所以我们使用堆来实现,只进行一次遍历获取最大的前k个元素,我们可以使用小堆来实现,让堆顶最小元素与查找元素比较,如果大于对顶交换。然后进行向下调整,继续进行比较,直到元素比较完。获取最小的前k个元素,我们可以使用大堆来实现,让对顶最大元素与查找元素比较,如果小于对顶交换。然后进...原创 2018-05-15 12:58:37 · 498 阅读 · 0 评论 -
堆排序
堆排序概念:使已有的堆进行排序,使得从0号下标位置到最后一个位置,元素一次增大或者依次减小堆降序,则要建立一个小堆 堆升序,则需建立一个大堆 步骤:建立一个堆(大堆或者小堆,这里建立一个小堆)让对顶元素与最后一个元素进行比较,如果大于堆顶元素,交换有效元素减1,对变化后的树进行调整为堆重复步骤2,知道只剩下一个元素恢复原来的有效元素个数代码展示使用到堆的基本操作...原创 2018-05-15 23:39:03 · 434 阅读 · 0 评论 -
堆和栈的理解
一、概念1、C/C++编译的程序占用的内存分为以下几个部分(1) 栈区(stack)———由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。(2) 堆区(heap)——— 是自由存储区,存放动态数据,像new,malloc()申请的空间就是堆区的,一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配...转载 2018-07-04 21:44:10 · 697 阅读 · 0 评论 -
【C语言笔记】函数的调用过程(栈桢)
一、什么是栈桢1、首先引入百度百科的经典解释:“栈帧也叫过程活动记录,是编译器用来实现过程函数调用的一种数据结构。”。2、栈帧表示程序的函数调用记录,而栈帧又是记录在栈上面,很明显栈上保持了N个栈帧的实体,(实际上我们这里说的栈帧是软件上的概念,据说有硬件概念,不是很了解),那就可以说栈帧将分割成了N个记录块,但是这些记录块大小不是固定不变的,因为栈不仅保存诸如:函数入参,出参,返回地址和...原创 2018-07-05 02:31:04 · 875 阅读 · 1 评论 -
栈的基本操作
编译环境vs2008Stack.h#pragma once#include <assert.h>#include <stdio.h>typedef int DataType;#define MAX_SIZE 10typedef struct Stack{ DataType _array[MAX_SIZE]; int _size;}Stack;...原创 2018-09-24 16:49:20 · 168 阅读 · 0 评论 -
栈的应用
编译环境vs2008Stack.h#pragma once #include <assert.h>#include <stdio.h>#include <string.h>//typedef int DataType; //基本操作使用//typedef char DataType; //括号匹配问题使用typedef int Data...原创 2018-09-24 16:56:31 · 225 阅读 · 0 评论 -
【数据结构】环形队列的基本操作
编译环境VS2008Queue.h####为了解决顺序队列的假溢出的问题,设计了环形队列#pragma once#include <assert.h>#include <stdio.h>#define MAX_SIZE 8typedef int DataType;typedef struct Queue{ DataType _array[MAX_S...原创 2018-09-24 17:01:28 · 1318 阅读 · 0 评论 -
【数据结构】链式队列的基本操作
概念:链式队列:特殊的单链表,只在单链表上进行头删和尾插操作1、首先链式队列需要一个一个节点构成,节点的结构是,有元素,有下一个节点的地址//定义一个节点typedef int DataType;typedef struct Node{ struct Node* _pNext; DataType _Data; }Node,*PNode;2、链式队列结构中有两个指针pHead...原创 2018-09-25 11:00:10 · 1481 阅读 · 0 评论 -
【数据结构】顺序队列
一、顺序队列的概念和分类1、概念:顺序队列的底层结构是数据存储元素的,用两个整形数字来表示队头和队尾的下标front和back2、顺序队列根据出入元素方式不同分为两种形式在这里插入图片描述二、代码展示1、队头不动编译环境VS2008Queue.h#pragma once #include <stdio.h>#include <assert.h>#...原创 2018-09-25 11:23:35 · 574 阅读 · 0 评论 -
【数据结构】队列的公共部分,可以插入任意类型的元素
#include <iostream>#include <cassert>using namespace std;#define MAX_SIZE 8template<class T>class Queue{public: Queue(); //初始化 T _array[MAX_SIZE]; int _front; int _...原创 2018-09-25 23:05:25 · 769 阅读 · 0 评论 -
【数据结构】链表的基本操作和深度练习
linklist.h#pragma once#include <stdio.h>#include <assert.h>#include <windows.h>typedef int DataType;typedef struct ListNode{ struct ListNode* pNext; DataType _data;}Node...原创 2018-10-04 16:39:26 · 221 阅读 · 1 评论 -
获取二叉树的结点,叶子节点,层数,以及k层结点个数
二叉树结点的个数(递归)int BinTreeSize(pBTNode pRoot){ if(NULL == pRoot) return 0; return BinTreeSize(pRoot-&gt;_pLeft)+BinTreeSize(pRoot-&gt;_pRight)+1;#if 0 int leftsize = 0; int ...原创 2018-05-07 02:18:53 · 5359 阅读 · 1 评论 -
二叉树的拷贝
递归的方法实现二叉树的拷贝//二叉树的拷贝pBTNode CopyBinTree(pBTNode pRoot){ pBTNode pNewRoot = NULL; if(pRoot) { //拷贝当前数的根节点 pNewRoot = BuyBinTreeNode(pRoot-&gt;_data); //拷贝根节点的...原创 2018-05-07 02:07:59 · 1573 阅读 · 0 评论 -
静态顺序表
//test.h#pragma once#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#define MAX_SIZE 10typedef int DataType;typedef struct SeqList { DataType _array[MAX_SIZE]; int _size; ...原创 2018-04-10 10:59:18 · 310 阅读 · 0 评论 -
无头结点单链表基本操作
linklist.h#pragma once#include &lt;stdio.h&gt;#include &lt;assert.h&gt;#include &lt;malloc.h&gt;#include &lt;stdlib.h&gt;#include &lt;string.h&gt;typedef int DataType;原创 2018-04-17 11:45:01 · 2378 阅读 · 0 评论 -
冒泡排序的优化
本程序与一般冒泡程序区别普通冒泡程序遍历一次数据只排一个元素(最大或最小)到确定的位置,而这里可以进行优化,一次排两个元素,即遍历一个数据,将最大值与最小值的位置确定好,这样将效率提高一半。但是在一次找到两个元素(最大值和最小值),将两个元素放到合适位置时(使用交换),任意一个先交换会影响到下一次的交换,所以在这里进行了分情况讨论。 优化后的程序还有一个亮点,就是给冒泡函数增加了一个...原创 2018-04-11 23:34:26 · 297 阅读 · 0 评论 -
动态顺序表
创建一个顺序表,对表中的数据元素增删查改//seqlist.h//实现动态顺序表的以下接口:#pragma once#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;malloc.h&gt;#include &lt;assert.h&gt;typedef int DataType;原创 2018-04-13 00:00:37 · 246 阅读 · 0 评论 -
逆序打印单链表
逆序打印单链表递归方法逐个遍历创建数组如下代码可参考链表的基本操作(点击查看)递归方法void PrintSListFromTail2Head(PNode pHead){ if(pHead == NULL) //pHead是头指针 return; else PrintSListFromTail2Head(pHead-&amp;gt;...原创 2018-05-10 02:01:51 · 1192 阅读 · 0 评论 -
删除链表的非尾节点(不能遍历链表)
可参考链表的基本操作(点击查看)void DeleteListNotTailNode(PNode pHead,PNode pos){ PNode pCur = pos-&amp;gt;pNext-&amp;gt;pNext; //事实上删除的是pos-&amp;gt;next,所以就要保存pos-&amp;gt;next-&amp;gt;next的数据 if(pHead == NULL || p原创 2018-05-10 02:12:38 · 451 阅读 · 0 评论 -
单链表查找中间结点(只遍历一次)
参考链表的基本操作(点击查看) 给两个指针 fast slow 让fast一次向末尾走两步,slow一次向末尾走一步,当fast指向NULL时,slow指向中间结点PNode FindMiddleNode(PNode pHead){ PNode fast = pHead; PNode slow = pHead; if(NULL == fast) ...原创 2018-05-10 02:28:51 · 3017 阅读 · 0 评论 -
单链表查找倒数第k的结点(只遍历一次链表)
参考链表的基本操作(点击查看) 方法:定义连个指针,让一个指针比另一个指针快向链表末尾走k步,当快指针指向NULL时,慢指针指向倒数第k个节点。PNode FindLastKNode(PNode pHead, int K){ PNode fast = pHead; PNode slow = pHead; if(NULL == pHead || K&lt;=0)...原创 2018-05-10 02:33:24 · 645 阅读 · 0 评论 -
循环队列的基本操作
队列的思维导图循环队列的功能实现//Queue.h#pragma once#include &lt;stdio.h&gt;#include &lt;assert.h&gt;#define _Maxsize 8typedef int DataType;typedef struct Queue{ DataType _arr[_Maxsize]; //存...原创 2018-04-26 01:20:10 · 402 阅读 · 0 评论 -
二叉树是否为完全二叉树
参考二叉树的基本操作(点击查看)下图判断是否二叉树 假设图中三个二叉树的黄颜色部分没有,各树的名称就是图上所标。 首先由要求,需要层序遍历,层序遍历会使用到队列。 要判断一个二叉树是否为完全二叉树,首先需要找到临界点,比如此二叉树C结点。如果C结点没有左右孩子,现在就要判断,B的左右孩子D和E,只要D和E至少一个有孩子,就不是完全二叉树。如果C有左孩子,和1一样判断D和E是否...原创 2018-05-10 23:12:48 · 756 阅读 · 0 评论 -
判断一个结点是否在二叉树中
二叉树的基本操作(点击查看) 要找一个结点判断是否是二叉树里面的结点,只需要将二叉树遍历一遍,用每一个节点与该结点进行比较即可。//查看一个是否是二叉树里的数据,是的话返回指针,不是的话返回NULLpBTNode find(pBTNode pRoot,BTDataType data){ pBTNode pNode = NULL; if(NULL == pRoot) ...原创 2018-05-11 00:19:12 · 1764 阅读 · 0 评论 -
链式队列(无头结点)
//环境 VS2008//Queue.h#pragma once#include &lt;stdio.h&gt;#include &lt;assert.h&gt;#include &lt;malloc.h&gt;typedef int DataType;typedef struct Node{ struct Node* _Pnext; DataType _...原创 2018-04-27 00:56:27 · 2070 阅读 · 0 评论 -
链式队列(带头结点)
注意事项:带头结点的链式队列在出队列时,出最后一个元素的与出其它元素不同,出非最后一个元素,队尾指针不变,一直指向第一个元素,当出最后一个元素时,队尾指针改变指向队头(也就是指向头结点),认真看看这里(这个例子并没看到带头结点方便)//编译环境 VS2008Queue.h#pragma once#include &amp;lt;stdio.h&amp;gt;#include &amp;lt;assert....原创 2018-04-27 01:07:02 · 3626 阅读 · 0 评论 -
二叉树的创建
创建一个如图所示的二叉树一、创建的步骤1、使用一个字符串存入二叉树的所有元素,空缺位置使用一个符号表示(这里使用#号) 2、遍历字符串,如果字符串的元素不为”#”,则创建,按照前序的方法创建(根结点-&gt;左结点-&gt;右结点),知道把所有元素创建完。//编译环境VS2008BinTree.h#pragma once#include &lt;stdio...原创 2018-05-07 01:43:48 · 517 阅读 · 0 评论 -
二叉树的遍历
二叉树的前序遍历(递归) 二叉树的中序遍历(递归)二叉树的后续遍历(递归)二叉树的中序遍历(递归)二叉树前序遍历(非递归)前序遍历 此方法是前序打印(根节点-&amp;gt;左子树-&amp;gt;右子树)void PreOrder(pBTNode pRoot){ if(pRoot) { //打印当前树的根节点的数据 printf(&quot;%...原创 2018-05-07 02:03:59 · 310 阅读 · 0 评论