数据结构
Y~哈哈哈
这个作者很懒,什么都没留下…
展开
-
单链表经典题型
单链表中经常考的题型中的四种题型:1.单链表逆置并打印,逆置又分为两种(1)就地逆置(2)头插法逆置(1)就地逆置顾名思义就是在不改变单链表存储的基础上进行逆置,下面的图片就是就地逆置的思想,具体见代码void Reverse(pList list){ assert(list != NULL); struct Node *p = NULL; struct Node *q ...原创 2018-10-13 11:47:31 · 567 阅读 · 0 评论 -
堆排序
堆排序分为两步:建初始堆和交换堆顶元素和末尾元素并重建堆( 排序) 时间复杂度为O(n) + O(nlgn)即等于O(nlgn)一、建堆:时间复杂度:O(n)堆我们正好可以用一个数组来存储,那么它将有如下的关系:i 表示第i个结点parent = (i-1) / 2;Lchild = 2*i + 1;Rchild = 2*i + 2;堆建立的时候有两点很重要:1...原创 2019-05-16 11:25:53 · 239 阅读 · 0 评论 -
树中两个结点的最低公共祖先
遇到这个题要分几种情况1、该树是一棵二叉搜索树: 由于二叉搜索树是排序过的,位于左子树的结点都比父节点小,而位于右子树的结点都比父节点大,我们只需要从树的根节点开始和两个输入的结点进行比较。如果当前结点的值都比两个结点的值大,那么最低的共同父节点一定是在当前结点的左子树中,于是下一步遍历当前结点的左结点。如果当前结点的值都比两个节点的值小,那么最低共同父节点一定在当前结点的右子树中,...原创 2020-04-09 11:38:39 · 220 阅读 · 0 评论 -
用O(1)事件复杂度删除第K个结点
删除第K个结点其实主要就是删除这个结点中的值,即可以删除第K+1个结点,然后把它的它拿来放在第K个节点处就行了Node **deleteKNode(Node **head, int k){ if((*head) == NULL) { return NULL; } Node *p = (*head); int len = 0; while(p) { p = p->...原创 2019-05-14 22:19:33 · 220 阅读 · 0 评论 -
二叉树的性质
1、在二叉树的第i层上至多有2^(i-1)个节点(i >= 1)2、深度为k的二叉树之多有2^k -1个节点(i >= 1)3、对任意一颗二叉树T,如果其终端节点数为 a,度为2的节点数为 b,则 a=b+14、具有n个结点的完全二叉树的深度为lgn +15、如果对一棵有n个结点的完全二叉树...原创 2019-05-10 18:14:19 · 165 阅读 · 0 评论 -
二叉搜索树转换成排序双向链表
因为二叉树中,每个结点都有两个指向子节点的指针。在双向链表中也有两个指针,它们分别指向前一个和后一个结点。由于这两种结点的结构相似,同时二叉搜索树也是一种排序的数据结构,因此在理论上可能实现二叉搜索树和排序链表的双向链表的转换。 在搜索二叉树中,左子节点的值总小于父节点的值,右子节点的值总是大于父节点的值(所以使用中序遍历)。因此在转换成排序链表的时候,原先指向左子节点的指针调...原创 2019-05-14 12:27:08 · 505 阅读 · 0 评论 -
KMP算法
一、KMP算法思想:定义两个整形变量 i、j,i 在源串的起始位置,j 在子串的起始位置,然后i、j同时开始向后走,如果i、j对应的值匹配就都++,如果不匹配,则 i 不动,j回退到k位置,这个k是存在next数组里的值,稍后说next数组二、举例计算: (1)我们知道 1 和 2 相等,1 和 3 相等,则可以推断得到 2 和 ...原创 2019-01-21 20:43:47 · 178 阅读 · 0 评论 -
数组与二叉树的转换
1、利用数组转换成二叉树——后序的方式TreeNode *Array_Tree(int *arr,int i, int n){ TreeNode *ptr = NULL; if(i > n || NULL == arr) { return ptr; } if(i < n) { ptr = BuyNode(); ptr->Lchild = Array...原创 2019-05-13 19:25:55 · 7158 阅读 · 0 评论 -
二叉树的构建
一、利用先序遍历的结果创建1:void CreateTree4(BtNode *&ptr,ElemType *&str){ if(NULL == str || *str == '#') { ptr = NULL; } else { ptr = Buynode(); ptr->data = *str; CreateTree4(ptr->...原创 2019-03-30 18:19:48 · 325 阅读 · 0 评论 -
BST(C实现)
BST树:(也称二叉排序树或二叉搜索树) 特点:如果左孩子不空,则左孩子一定比根结点值要小,如果右孩子不空,则右孩子一定比根节点值要大头结点的组成如下:Lchild(指向BST最小结点) parent(指向BST的根) data(随机值) Rchild(指向BST最大结点) 一、创建结点:#include<iostream>using ...原创 2019-03-30 18:21:16 · 483 阅读 · 0 评论 -
一组数据的全排列——分治法
一、思想——全排列 依次将待排列的数组的后n-1个元素分别与与第一个元素交换,则每次递归处理的都是后n-1个元素的全排列。当数组元素仅有一个e为此递归算法的出口。 也就是说交换的步骤是这样的: (1)第一个数与第一个数交换,然后对第一个数后面的所有数进行排列。当对后面的数进行排列的时候,将这组数据中的第一个数与第一个数交换.....这样一直交换下去,当只剩一个数据的时候输出,...原创 2019-03-30 18:21:56 · 1404 阅读 · 0 评论 -
斐波那契的递归与非递归
一、非递归int Fibonacci(unsigned int n){ int a = 1, b = 1, c = 1; for(int i = 3; i <= n; i++) { c = a + b; a = b; b = c; } return c;}二、递归int Fibonacci(size_t n) { if(n == 1 || ...原创 2019-01-05 14:59:53 · 5646 阅读 · 0 评论 -
快速排序
快排的思想是:先从后往前找比它小的数,然后再从前往后找比它大的数,完成一次快排之后返回第一次关键字完成一次快排的位置,然后再从它的左边开始递归,直到左边全部有序之后,再用同样的方法快排右边的算法描述:快速排序使用分治法来把一个串分为两个子串,具体如下:从数列中挑出一个元素,称为“基准” 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准大的摆在基准的后面。在这个分区退...原创 2019-03-30 18:22:14 · 228 阅读 · 0 评论 -
BF算法
BF算法:是一种比较简单的字符串匹配算法,在处理简单的数据时候就可以用,完全匹配,速度很慢,时间复杂度最坏情况O(m*n)(m,n分别为2个字符串的长度)算法的思想:定义两个整型变量,i,j,i是用来遍历S串的,j是用来遍历P串的,两个整形变量同时从0位置开始走,如果i、j位置对应的值匹配,那么 i++,j++,否则,i 回退到 i = i -j +1位置,j 回退到0位置时间复杂...原创 2019-03-30 18:22:35 · 2080 阅读 · 0 评论 -
线段树
题目:对一个数组重复的随机的找一段连续数据进行求和(query)以及重复的随机的改(updata)某一个位置处的值第一种解法:再开一个数组,这个数组用来存和,图如下:void Sum_arr(int *arr,int len1, int *sum_arr){ int i=0,j=0; while(i < len1) { if(i == 0)...原创 2019-05-16 19:11:36 · 168 阅读 · 0 评论