数据结构
L_R_
这个作者很懒,什么都没留下…
展开
-
栈应用逆波兰表达式
逆波兰表达式逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法,按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。下面是一些例子:正常的表达式 逆波兰表达式a+b ---> a,b,+a+(b-c) ---> a,b...原创 2018-09-26 12:14:01 · 167 阅读 · 0 评论 -
二叉树的递归与非递归遍历
其实二叉树的遍历最重要的一点就是递归!!!前序遍历二叉树的前序遍历,也就是先序遍历,先遍历根节点,然后遍历左子树,接着是右子树。不断的递归。比如下面这棵树:它的先序遍历就是1,2,4,5,3,6,7代码如下:void Preorder(BNode *root){ if (root == NULL) { return; } printf("%d ", root-&gt...原创 2018-10-31 10:53:53 · 168 阅读 · 0 评论 -
二叉树结点个数、叶子节点个数、第K层节点数、高度
其实解决二叉树有关的问题少不了要用递归,我们在用递归的时候要想想树的五种形式是否都满足,以确定终止条件即可。求二叉树的结点个数空树返回0,其他返回左子树节点数+右子树节点数+1//求二叉树的结点个数int GetSize(BNode *root){ if (root == NULL) { return 0; } return GetSize(root->left...原创 2018-10-31 11:46:27 · 2573 阅读 · 0 评论 -
队列的基本操作
队列的概念只允许在一端进行插入出具操作,在另一端进行删除数据操作的特殊线性表,进行插入操作的一端称为队尾(入队列),进行删除操作的一端称为队头(出队列)队列具有先进先出(FIFO)的特性。链式队列有以下三种情况链式队列定义typedef int Qdatatype;//链式队列typedef struct QNode { Qdatatype data; struct QNod...原创 2018-10-26 18:11:33 · 430 阅读 · 0 评论 -
二叉树中查找一个结点
在二叉树中查找一个结点在二叉树中查找一个结点,如果找到返回结点地址,如果没找到,返回NULL查找策略:优先左,如果是空树,返回NULL;如果查找的是根,直接返回根的地址,先去左子树中找,如果找到了,返回结果,如果左子树也没有找到,再去找右子树。Node * Search(BNode *root, TDatatype key){ if (root == NULL) { return...原创 2018-10-31 19:18:27 · 5342 阅读 · 0 评论 -
二叉树层序遍历、判断是否是完全二叉树
二叉树的层序遍历二叉树的层序遍历我们需要用到队列,先把根节点放进队列,当队首不为空时,取队首元素,Pop队列,打印队首元素,如果队首结点的左子树不为空,就把队首结点的左子树放到队列中,如果队首结点的右子树不为空,就把队首节点的右子树放到队列中。void LevelOrder(BNode *root){ Queue queue; QueueInit(&queue); if (...原创 2018-10-31 21:14:50 · 2927 阅读 · 0 评论 -
实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值)的时间复杂度为O(1)
这道题考查栈的知识点,要求实现一个栈,在对这个栈进行入栈和出栈以及返回最小栈元素时要求时间复杂度为O(1)。方法一:用两个栈,一个正常出入栈,另一个存最小栈,入栈的时候第一个站正常入,最小栈如果为空或者要入的data比最小栈的栈顶元素小的时候才给最小栈入栈。否则每次入栈的时候就将最小栈的栈顶元素再入。例如下图:这样的话,出栈也是正常出,我们找最小元素的时候直接找最小栈的栈顶就ok...原创 2018-10-30 09:26:23 · 5567 阅读 · 3 评论 -
求一棵二叉树的镜像
什么是二叉树的镜像?给定一棵二叉树,那么它的镜像就是根不变,左右子树交换,子树的左右子树也交换。例如给定下面一颗二叉树:那么它的镜像如下图:代码:void Mirror(BNode *root){ if (root == NULL) { return; } BNode *t = root->left; root->left = root->right...原创 2018-11-06 18:56:31 · 253 阅读 · 0 评论 -
求二叉树中两个最近的公共祖先结点
先解释一下这道题的意思,就是给定一棵二叉树,然后这棵树上有两个结点,请找出他们两个的最近公共祖先,也就是它们两个距离最近的公共结点,例如:上面这棵树中D和F的最近公共祖先就是A,D和E的最近公共祖先就是B。那么我们会发现如果这两个结点分别在root的左右两颗子树上,那么它们两个的最近公共祖先一定是根节点。代码如下:BNode *GetNearestAncestor(BNode *r...原创 2018-11-06 19:09:00 · 1402 阅读 · 0 评论 -
判断一棵二叉树是否是平衡二叉树
我们先来整理一下什么是平衡二叉树?满足以下两点的就是平衡二叉树:1.左右子树的高度差不能超过12.左右子树也是平衡二叉树需要注意的是空树也是平衡二叉树例如下面这棵树就不是平衡二叉树因为对于B来说左右子树高度超过了1,所以它不是平衡二叉树。方法一:这样的话,如果是空树则是平衡二叉树,如果不是空树,我们就去判断左子树是不是平衡二叉树,判断的依据就是左右子树高度差不超过1,代码如...原创 2018-11-06 19:36:08 · 16137 阅读 · 9 评论 -
七大排序算法
插入排序(稳定算法)我们认为在一组数中,可以分为三个部分,有序区,无序区和待排序区,例如下图:蓝色部分是有序区,黄色部分表示即将要排序的,灰色是无序区,那么我们怎么在有序部分找到黄色应该插入的位置呢?从后往前找。可以从蓝色部分的后面往前找,分别和黄色比较,找到相应的位置代码如下:void InsertSort(int array[], int size){ int key;...原创 2018-11-10 14:55:03 · 551 阅读 · 1 评论 -
二叉树的概念及创建
二叉树的概念一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵分别称为左子树和右子树的二叉树组成。二叉树的形式二叉树的性质1.若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1)(i>0)个结点2.若规定只有根节点的二叉树的深度为1,则深度为K的二叉树的最大结点数是2^k-1(k>=0)3.对任何一棵二叉树, 如果其叶结点个...原创 2018-10-31 10:20:20 · 671 阅读 · 0 评论 -
贪吃蛇小游戏
贪吃蛇介绍贪吃蛇是一款很老的游戏了,大家一定都玩过,我们一起写个简单的贪吃蛇游戏吧。本款贪吃蛇的规则如下:1.不能撞自己2.不能撞墙3.蛇吃食物的时候,自身要长一截4.可以通过用户控制对蛇加速和减速5.更重要的一点是游戏当然得有加分。这里我们可以从MVC的角度考虑(Model View Controller)Model :数据结构/结构体,就是整个游戏的结构View...原创 2018-10-22 19:41:34 · 449 阅读 · 1 评论 -
栈的应用之括号匹配问题
判断代码中,左右括号是否匹配,例如:1.char a[]="(())abc{[(])}";//左右括号次序匹配不正确2.char b[]="(()))abc{[]}";//右括号多于左括号3.char c[]="(()()abc{[]}";//左括号多于右括号4.char d[]=&原创 2018-09-26 10:51:56 · 215 阅读 · 0 评论 -
栈的基本操作
[TOP]栈栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。不含任何元素的栈称为空栈,栈又称为后进先出(LIFO)的线性表。栈的定义#define MAX 100 typedef int datatype;typedef struct { datatype arry[MAX]; int top;//表...原创 2018-09-26 09:49:07 · 196 阅读 · 0 评论 -
判断链表相交,若相交,求交点。(假设链表可能带环)
首先我们分析,两个链表是否相交,是否带环,有以下几种情况:求两个链表是否带环可以分成三个情况:1.都不带环,可以转换成两个链表是否相交的问题。2.一个带环,一个不带环。–>不相交3.都带环: 分别求环的入口点 1.入口点相同–>一定相交在环外 2.入口点不同 分别求环的长度 1.长度不相等–>两个链表不相交 ...原创 2018-09-19 22:28:52 · 117 阅读 · 0 评论 -
复杂链表的复制
复杂链表的复制一个链表的每个结点,有一个指向next指针指向下一个结点,还有一个random指针指向这个链表中的一个随机结点或者NULL,现在要求实现复制这个链表,返回复制后的新链表。首先我们先给出这个复杂链表,并将其初始化代码:typedef struct ComplexNode{ int data;//数据域 struct ComplexNode *next;//指...原创 2018-09-19 20:20:09 · 123 阅读 · 0 评论 -
链表和顺序表的面试题
文章目录❤从尾到头打印链表方法一:方法二:❤删除一个无头单链表的非尾结点(不能遍历)❤在无头单链表的一个结点前插入一个结点(不能遍历)❤单链表实现约瑟夫环(JosephCircle)❤ 逆置/反转单链表方法一:方法二:❤合并两个有序链表,合并后依然有序❤查找单链表的中间结点,要求只能遍历一次链表❤查找单链表的倒数第k个结点,要求只能遍历一次链表❤删除链表的倒数第k个结点❤复杂链表的复制❤判断两个链...原创 2018-09-19 17:45:48 · 212 阅读 · 0 评论 -
双链表(双向带头循环链表)
双向链表双向链表也叫双链表,是链表中的一种。它的每个数据结点中都有两个指针,分别指向直接前驱和直接后继,所以从链表的任意一个结点都可以很方便的访问到它的前驱结点和后继结点,一般我们都构造双向循环链表。带头结点和不带头结点 其实这个带头结点和不带头结点在单链表那篇博客中就应该提的,但是我放在这里,原因是,本篇主要介绍带头结点的双向循环链表。在这里结合例子介绍会更加清楚一些。那么...原创 2018-09-17 12:39:00 · 575 阅读 · 1 评论 -
单链表
链表前面讨论过顺序表的静态和动态,我们知道顺序表在内存中是按顺序连续存储的,这就使得我们的插入和删除操作变得非常的不方便,每次都需要从头遍历,那么链表在内存中是怎样存储的呢?我们来看下图顺序表和链表在内存中的存储从上图中我们可以看出来,链表和顺序表在内存中的存储方式是不一样的,链表并非是连续存储在内存中的,而是以结点的方式进行存储的,前一个结点中存储着下一个结点的地址,这样我们从第一个...原创 2018-09-14 23:29:28 · 286 阅读 · 0 评论 -
顺序表(动态)
上篇博客介绍了静态顺序表的增删查改以及排序,我们知道了:静态顺序表的长度是固定的,但是如果我们在使用顺序表是并不知道顺序表的长度,或者在使用过程中,顺序表的长度不够了,难道我们要重新再创建一个新的顺序表吗?这样显然是很麻烦的。所以本篇博客将讨论动态顺序表。那么动态顺序表和静态顺序表又有什么区别呢?上面我们提到了静态顺序表的局限性,那么动态顺序表很有效的解决了静态的不足之处,当在使用顺序...原创 2018-09-13 11:05:39 · 365 阅读 · 0 评论 -
顺序表(静态)
1.静态顺序表的定义//静态顺序表 typedef int DataType;typedef struct SeqList { DataType data[MAX]; //顺序表中的数据 int sz;//表示当前顺序表有效数据的个数 }SeqList, *pSeqList; 2.初始化//初始化void InitSeqList(pSeqList ps){ ...原创 2018-09-12 17:53:17 · 307 阅读 · 0 评论 -
迷宫(栈回溯)
迷宫介绍在生活中我们玩过很多种走迷宫的小游戏,游戏给了一个迷宫,这个迷宫中只有一个入口,我们要从这个入口一直走下去,直到找到出口,这里出口可能是一个,也可能是多个。在这里我简单介绍三种实现起来由易到难的迷宫。前提说明我们这里的坐标是x轴正半轴向下伸展,y轴正半轴向右伸展简单迷宫这是一种简单迷宫,有一个入口和一个出口,我们从入口开始按照左上右下的顺序进行尝试走迷宫,如果都走不了,就...原创 2018-10-09 16:13:14 · 1129 阅读 · 0 评论 -
判断单链表是否带环?若带环,求环的长度?求环的入口点?
判断单链表是否带环?若带环,求环的长度?求环的入口点?这道题有三问,是否带环?环的长度?环的入口点?1.单链表是否带环?思路分析:怎么样才算带环呢?我们细想,如果一个单链表带环的话,那么它怎么走都走不出来的,而如果不带环的话,那么一定会走到NULL的。设置快慢指针,刚开始都指向链表的起始位置,快指针一次走两步,慢指针一次走一步,如果两个指针相遇,则带环;若快指针走到NULL,则不带环...原创 2018-09-19 20:09:57 · 146 阅读 · 0 评论