数据结构
The Laughing Uncle
专业踩各种坑
展开
-
顺序表的相关操作(静态&动态)
静态顺序表定义定义结构体初始化顺序表销毁顺序表打印顺序表插入元素尾插头插任意位置插入元素删除元素尾删头删任意位置删除删除遇见的第一个指定元素删除所有的指定元素查找指定元素排序冒泡排序选择排序测试函数动态顺序表定义结构体初始化销毁插入尾插头插任意位置插入元素一般情...原创 2018-09-09 14:39:30 · 463 阅读 · 0 评论 -
堆及其相关操作
文章目录堆向下调整堆的创建大堆小堆堆的初始化堆顶元素堆的插入堆的删除向上调整TopK堆堆,也叫做二叉堆。目的:在堆中找到最值(最大值、最小值) 堆顶存放的不是最大值就是最小值堆是已数组的形式存储的,但在逻辑上是完全二叉树例如: int arr[] = { 53, 17, 78, 9, 45, 65, 87, 23, 31 };对应的堆为:注:上述堆还未进行调整ty...原创 2018-10-17 15:37:53 · 222 阅读 · 0 评论 -
镜像二叉树(递归/非递归)
镜像二叉树:根节点的左右孩子交换 所有节点的左右孩子都交换例如:递归递推公式:根节点的左子树和右子树换位置终止条件:空树 void MirrorTree(BNode *root) { if (root == NULL) { return; } BNode *tmp = root->left; root->left = ro...原创 2018-10-16 13:41:43 · 320 阅读 · 0 评论 -
前序、中序、后序递归、非递归方式打印二叉树
文章目录递归前序中序后序非递归前序中序后序递归前序 void PreOrder(BNode *root) { if (root == NULL) { return; } printf("%d ", root->data); //先打印根节点 PreOrder(root->left); //打印左子树 PreOrder(root->right)...原创 2018-10-15 19:14:02 · 1225 阅读 · 1 评论 -
二叉树结点、叶子结点个数,高度,第K层几个结点
文章目录结点个数叶子结点个数二叉树高度第K层几个结点二叉树的结点个数二叉树叶子结点个数二叉树第K层结点个数二叉树的高度在二叉树中,我们经常用到递归,再用递归的时候,经常会用到:递推公式,终止条件递推公式:如果左子树和右子树的结果都有了,按照这个二叉树有三个结点往下操作终止条件:递归一般都必须有终止条件,按照二叉树的五种基本形态考虑终止条件会比较简单一点最后就是要考虑递归函数中的...原创 2018-10-15 17:14:45 · 1685 阅读 · 0 评论 -
根据前序(后序)和中序遍历创建二叉树
根据前序和中序遍历创建二叉树根据后序和中序遍历创建二叉树注:如果仅仅知道三种遍历中的任何一种是无法准确还原一颗二叉树的前序和中序创建二叉树例如:对于这样的一颗二叉树,其相应的前序和中序遍历分别是:DataType preorder[] = { 1, 2, 4, 7, 3, 5, 6 };DataType inorder[] = { 4, 7, 2, 1, 5, 3, 6 };...原创 2018-10-15 16:53:54 · 653 阅读 · 0 评论 -
栈的操作及其应用
文章目录栈结构体定义初始化销毁压栈出栈栈顶元素栈的大小栈是否为空判断括号匹配逆波兰表达式迷宫简单迷宫多通路迷宫(不带环)多通路迷宫(带环)栈栈(stack)又名堆栈,仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉...原创 2018-09-26 17:16:57 · 517 阅读 · 0 评论 -
链表的相关操作
定义定义结构体初始化销毁插入头插尾插随机插入(在结点pos前面插入)删除头删尾删随机删除(删除pos结点)查找删除(第一个数值为data的结点)删除(所有值为data的结点)定义 #include <stdio.h> #include <stdlib.h> #inc...原创 2018-09-13 21:10:50 · 114 阅读 · 0 评论 -
判断两个单链表是否相交,若相交,求节点(链表不带环)
先理解一下题目的意思,单链表的相交和普通两条线的相交一样吗?所以当我们把其换成节点就可以变成下面这样:先判断链表是否相交,我们可以运用两个链表相交后就变成了一条链表这个特性来判断,因为如果两条链表相交,那么这两条链表的最后一个节点一定是同一个节点,否则不可能相交 //1表示有交点,0表示没有交点 int IsIntersection(Node *first1, Node *first2...原创 2018-09-18 20:18:53 · 288 阅读 · 0 评论 -
复杂链表的复制
复杂链表的复制。一个链表的每个节点,有一个指向next指针指向下一个结点,还有一个random指针指向这个链表中的一个随机节点或者NULL,现在要求实现复制这个链表,返回复制后的新链表。题目的意思可以简化,就是一个节点含有两个指针和一个数据。用图表示:如果要实现复杂链表的复制,我们通常的想法和单链表的复制一样,先按照next进行复制,然后在复制random(注:这种事错误的,不能实现)。为什...原创 2018-09-18 13:29:59 · 150 阅读 · 0 评论 -
查找(删除)单链表的倒数第k个结点
1.查找单链表的倒数第k个结点(只能遍历一次链表) 2.删除单链表的倒数第k个结点对于第一个问题,如果可以两次遍历链表,我们就可以先计算出链表的长度,然后再减去k-1就能求得倒数第k个结点 但只能遍历一次链表,我们就可以用使用两个指针front,back,让front先走,走k-1个结点,然后再让front和back同时走当front走到最后结点的时候,back就走到了倒数第k个结点 ...原创 2018-09-16 22:03:50 · 686 阅读 · 0 评论 -
查找单链表的中间结点(要求只能遍历一次链表)
如果没有要求,我们就可以先将链表遍历一遍,记录一共有多少个元素,然后再遍历一遍,就能找到中间元素。 但题目要求只能遍历一次链表,我们就要换一种思路,用一个快指针一步可以走两个结点,慢指针一步走一个结点,两者同时开始从头结点走,当快指针走到最后一个结点或者倒数第二个结点的时候,慢指针就刚好走到了中间结点 void FindMiddle(Node *first) { ...原创 2018-09-16 20:35:21 · 2351 阅读 · 1 评论 -
单链表实现约瑟夫环
来历:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再...原创 2018-09-16 16:21:17 · 686 阅读 · 0 评论 -
逆置单链表、替换法之无头单链表的插入与删除
1. 从尾到头打印单链表我们知道,单链表只能够通过前面结点来找到后一个结点,不能直接通过后一个结点来找前一个结点,所以如何先打印后面的元素,在打印前面的元素。可以想到运用递归,设头结点为first 第一次函数调用:first-&gt;next 第二次函数调用:first-&gt;next-&gt;next 第三次函数调用:first-&gt;next-&gt;next-&gt;next...原创 2018-09-16 14:52:08 · 292 阅读 · 0 评论 -
二叉搜索树相关操作及其应用
文章目录二叉搜索树查找递归查找非递归查找插入递归插入非递归插入删除二叉搜索树左孩子小于根节点右孩子大于根节点二叉排序树中序的结果是升序的 int arr[] = { 5, 3, 7, 1, 4, 6, 8, 0, 2, 9 }; typedef int Key; typedef struct BSTreeNode { Key key; struct BSTree...原创 2018-10-21 17:16:13 · 258 阅读 · 0 评论