- 博客(24)
- 收藏
- 关注
原创 堆的创建以及简单操作
今天我给大家介绍的是堆,其实大家要深刻理解数据结构这个概念,队列也好,栈也好,二叉树也好,还有我今天要说的堆,其实他并不是说,他就是一个单独的数据结构或者说是一种和之前完全不一样的东西,这些东西是你用之前的知识对他进行特定的设定而构造出来的。就比如说栈经常是用数组来实现,队列,二叉树经常是用链表来实现,而并不是说他就是一个单独的全新的数据结构,为什么我要说这些是因为这个堆其实包括形状也好甚至思路也...
2018-04-30 22:53:50
508
原创 注释转换
将c语言类的注释(/* */)通过程序转换成c++类注释(// )。当你遍历一个文件的时候会处于五种状态:第一种是正常代码状态,第二种是找到了代表注释的/,第三种是找到了代表注释的*,第四种是当前在C语言的注释类型中,第五种是当前在c++的注释类型中。因为你的状态类型是有限的所以通过一个枚举类型的结构体来表示现在程序所处的状态。enum State{NORMAL,//正常状态FOU...
2018-04-26 23:28:32
481
原创 二叉树的非递归后序遍历
昨天写了二叉树的先序、中序的非递归遍历,今天写的是二叉树的后序非递归遍历,为什么将后序和前边两个分开写,因为后序并不是想递归那样直接在先序上进行一个简单的更改就行了,非递归的情况是这三种之中最复杂的。为什么这么说?因为按正常思维来说写出来的后序遍历是很容易陷入一个死循环之中的。 还是拿之前的图来说,后序遍历的话你需要先访问完1的左子树,然后右子树,然后再是1.想访问2的话就是先访问3,4。...
2018-04-23 22:25:52
958
原创 二叉树的先序、中序非递归遍历
之前写过二叉树的递归遍历的三种情况,很简单的讲解,很简单的代码就能实现,因为二叉树的很多操作都基于二叉树这个自然的递归情况,所以操作起来十分简单。但是我们今天还是要介绍一下二叉树的非递归遍历,为什么还要写这个更复杂的非递归遍历呢?其实这个大家也应该都清楚啊,递归的优点和缺点,如果你的树足够大的话,一直递归下去怎么办?栈的空间通常也只有几兆大小而已,总有一天会用完,所以就需要通过非递归的方式来解决这
2018-04-22 23:50:06
702
原创 单链表实现约瑟夫环问题
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。今天我是需要做的是通过函数来计算约瑟夫环中的最后那个数是什么。其实这里不过是需要一个成环的单链表,然后通过循环不断的找到第m个数然后将第m个数删
2018-04-21 23:13:05
1303
原创 判断二叉树是否是完全二叉树
二叉树中有一个知识点就是完全二叉树,先介绍一下什么是完全二叉树。 我们之前所用的二叉树就是完全二叉树若设二叉树的深度为h,除第h 层外,其它各层(1~h-1)的结点数都达到最大个数,第 h层所有的结点都连续集中在最左边,这就是完全二叉树。 将这颗树的4结点去掉这棵树就不再是完全二叉树。如何通过程序来判断某一颗树是不是完全二叉树呢?其实通过上边对完全二叉树的定
2018-04-20 23:43:52
1447
原创 C语言光标移动函数
static void _SetPos(int x, int y)//移动光标到X、Y位置{COORD position;HANDLE handle;handle=GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(handle, position);}C语言光标移动函数,COORD实际上是一个C语言内部做好的结构体,结构...
2018-04-19 23:00:10
20485
3
原创 求二叉树深度以及寻找二叉树中某一节点值
size_t BTreeDepth(BTNode* root) BTNode* BTreeFind(BTNode* root, BTDataType x) 求二叉树的深度依然用的是二叉树递归的特性。二叉树的深度就是你根节点的这一层加上他左孩子或者右孩子中深度大的哪一个,同样这也能被划分为子问题。 size_t BTreeDepth(BTNode* root){if (root == NULL)return 0;if (BTreeDepth(root->_left) >
2018-04-17 14:34:51
4866
原创 二叉树的层序遍历
之前写过二叉树的先序、中序、后序遍历,今天给大家介绍一下二叉树的层序遍历。二叉树的层序遍历 层序遍历也很好理解,一层一层的将你的二叉树遍历后输出。根据这个图输出顺序也就是125346. 上一篇文章也说了,二叉树的操作大多是通过递归来实现的,如果还按你以前的顺序你会遍历1,2,3,4这样下去,但是你现在又不能输出,那要怎么办?最早我的想法是用一个栈存起来,我让二叉树后序遍历,然后将这些遍历过得顺序...
2018-04-16 23:43:54
1903
原创 二叉树的基本操作
在学习数据结构的时候学完栈、队列之后下一个比较难、比较重要的就是树。它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个节点有零个或多个子节点;没有父节点的节点称为根节点;每一个非根节点有且只有一个父节点;除了根节点外,每个子节点可以分为多个不相交的子树。这是百度的一个词条介绍,一点都不...
2018-04-15 19:22:33
435
原创 元素出栈、入栈顺序的合法性。
元素出栈、入栈顺序的合法性。如入栈的序列(1,2,3,4,5),出栈序列为 (4,5,3,2,1) Inarr代表你的输入顺序,也就是你的入栈顺序,outarr就是输出顺序也就是你的出栈顺序。这里纯说思想感觉不容易理解,结合程序给大家介绍一下。void Check(int inarr[], int outarr[], int n, Stack *s1){int x = 0;int y= 0;w...
2018-04-14 12:32:39
1126
原创 两个队列实现一个栈
之前写过通过两个栈来实现一个队列的情况,今天是两个队列实现一个栈,其实还是之前说的,队列和栈的区别还是本质上的对数据操作的区别,栈是只能在栈顶位置进行操作,队则是队尾插入元素,队头删除元素。 这是两个队。还是同样选取其中一个队当做入数据的,因为栈是先进后出,所以当你入数据的队列完成入数据的时候,如果想出就需要借用Q2队列, 依次入四个元素1、2、3、4,这时候如果想出元素的话,要出
2018-04-13 12:22:11
489
原创 一个数组实现两个栈(共享栈)
一个数组实现两个栈,既然是一个数组变成两个栈,首先得把你的数组分成两部分, 这是一个十个元素的数组,有几种方法把他分成两部分呢?这么分! 还是这么分! 或者这么分!言归正传,其实分成两部分还是有两种分发的,第一种就是我上边画的第三种从中间开始分,将你的数组分成两个,分别成为一个栈。但是还有一种分发,是比较不容易想到的,那就是将你的数据的数据进行奇偶分开。 下标是红色的是一个栈,绿色的是另外一个栈...
2018-04-12 15:22:40
2299
原创 使用两个栈实现一个队列
大家都知道,栈和队列是两种不同的数据结构,栈是只能在栈顶对数据进行操作,队列是一个在队尾插入元素,在队头删除元素的数据结构。其实最通俗的一点这两个的区别就是,栈是先进后出,而队列是先进先出。 今天要解决的问题是,用两个栈来实现一个队列。 两个栈分别来实现不同的功能,S1用来做队的队尾,专门用来将元素入队,S2则是用来做队的队头,专门用来出元素。 入的话就是直接在S1中入元素
2018-04-11 21:22:19
697
原创 实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值)的时间 复杂度为O(1)
实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值)的时间 复杂度为O(1) 其实找到这个栈的最小值并不难,难的是让返回最小值的复杂度为0(1)也就是说我什么时候想要这个栈中的最小数的你不需要遍历栈直接就可以返回给我。 其实这种题有两种思路,第一种是创建两个栈,用两个栈来实现,其中一个栈就是正常存放你的数据,另一个栈就是用来存放你的栈中所有元素的最小值。 正常栈入的第一个元...
2018-04-10 21:22:24
1347
原创 栈和队列迷宫问题
#define N 6 int maze[N][N] = { {0,0,0,0,0,0}, {0,0,1,1,1,0}, {0,0,1,0,1,0}, {0,0,1,1,1,0}, {0,0,1,0,1,1}, {0,0,1,0,0,0}, }; 通过一个数字来创造一个6*6的迷宫,其中0代表墙,1代表能够走的路。 这里将数组通过画图软件画出来,这里红色的1代表迷宫的入口,绿色的1代表迷宫的出口。...
2018-04-09 22:26:08
3318
原创 复杂链表的复制
复杂链表的复制。一个链表的每个节点,有一个指向next指针指向 下一个节点,还有一个random指针指向这个链表中的一个随机节点 或者NULL,现在要求实现复制这个链表,返回复制后的新链表。
2018-04-07 22:09:28
994
原创 判断两个链表是否相交,若相交,求交点。(假设链表可能带环)【升级版】
这个图是两个链表的六种状态第一种是最常见见也是最简单的状态,两个不带环单链表并且两个链表不相交。第二种是两个不带环单链表在半路相交了,之前也写过判断两个链表是否相交的函数,第三种是一个链表带环一个链表不带环,但是两个链表不想交,第四种是两个链表都带环,但是彼此不相交,第五种是一个带环一个不带环,两个相交但是相交位置是在带环链表的环外,第六种就是最复杂的一种,一个链表带环一个不带环,两个链表相交,但...
2018-04-06 13:13:41
717
原创 求两个已排序单链表中相同的数据。
void UnionSet(SListNode* l1, SListNode* l2){ assert(l1 || l2);while ((l1!=NULL)&&(l2!=NULL)){ if (l1->_data == l2->_data){printf("%d\n", l1->_data);l1 = l1->_ne...
2018-04-05 20:34:59
1323
原创 判断两个链表是否相交,若相交,求交点。(假设链表不带环)
int SListIsCrossNode(SListNode* list1, SListNode* list2){SListNode *L1 = list1;SListNode *L2 = list2;DataType n1 = 0;DataType n2 = 0;DataType n = 0;while (L1){n1++;L1 = L1->_nex...
2018-04-04 11:59:48
656
原创 判断单链表是否带环?若带环,求环的长度?求环的入口点?并计算
void SListIsCycle(SListNode* list){assert(list);SListNode *fast = list;SListNode *slow = list;SListNode *entry=list;SListNode *meet = NULL;DataType count = 0;fast = fast->_next->...
2018-04-03 23:14:13
650
原创 查找单链表的倒数第k个节点,要求只能遍历一次链表
查找单链表的倒数第k个节点,要求只能遍历一次链表,这里和之前所写的查找中间节点是一样的道理还是利用快慢指针问题来进行操作,但是这次和上次有一些小小的不同,这里是先让fast快指针先进行走K步,然后快慢指针同时走当fast指针走到最后的时候慢指针就停在了倒数第K位置。查找单链表的倒数第k个节点,要求只能遍历一次链表,这里和之前所写的查找中间节点是一样的道理还是利用快慢指针问题来进行操作,但是这次和上...
2018-04-02 21:35:31
1099
原创 查找单链表的中间节点,要求只能遍历一次链表
今天写的函数是查找单链表中的中间节点,但是要求只能遍历一遍,如果不是这个条件来限制的话,可以先将链表遍历一遍,然后通过计数器来计算链表中的数据个数然后通过循环来找中间的结点,但是要求只能遍历一遍也就是说你在知道这个链表中有多少个数据的同时就要知道他的中间数据是哪一个。 这样的话就不能通过刚刚所说的方法来实现,但是刚刚也提到了如果你在知道总共有多少个元素的同时知道他中间元素是哪一个就可以了,也就...
2018-04-01 21:53:57
1438
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人