- 博客(30)
- 资源 (4)
- 收藏
- 关注
原创 具有n个节点的度为m的树的最大高度和最低高度推导
一、最大高度试想一下,若有n个节点的m叉树,当只有最后一层有m个节点,其余层均只有一个节点,在所有含有个节点的m叉树中一定是最高的。二、最低高度当每个非终端节点均含有m个孩子节点时间,此时整棵树在所有含有n个节点的m叉树中是最矮胖的,此时这棵树的高度也是含有n个节点m叉树中高度最低。在极限的状态下可以称之为满m叉树,因此可以推导不等式,得出最低高度。结论:综上分析,对于一个含有n个节点...
2019-11-29 12:23:03 8313 4
原创 单源最短路径--floyd算法
void floyd() { for (int k=1; k<=n; ++k) { for (int i=1; i<=n; ++i) { for (int j=1; j<=n; ++j) { if (i == j || i == k || j == k) continue; //避免不必要的判断 提高程序效率 else g[i][j] = min(g...
2019-11-27 22:12:31 453
原创 四大查找ASL的总结
一、一般线性表的顺序查找ASL成功 = (n+1)/2ASL失败 = (n+1)二、有序线性表的顺序查找ASL成功 = (n+1)/2ASL失败 = (n+1)/2 + n/2三、二分查找二分查找的ASL成功和ASL失败通过画出对应查找序列的判定树,进而进行计算。四、索引查找ASL = I块内 + I块间其中块间可以使用二分查找。(1)ASL = (b+1)/2 + (s+1...
2019-11-26 20:54:44 6843
原创 数据结构中“哨兵”的使用
1.顺序查找中的哨兵:通过引入哨兵,可以必满很多不必要的语句,从而提高程序效率。2.直接插入排序的哨兵:免去查找过程中每一步都要检测整个查找表是否产找完毕,提高查找效率。...
2019-11-26 20:18:33 1990
原创 二叉树:在孩子兄弟链表表示的树中求叶子节点的个数
typedef struct CSNode { int val; CSNode *firstchild, *nextsibling;} CSNode, *CSTree;int dfs(CSTree *root) { if (!root) return 0; else if (!root->firstchild) return 1; else { int le...
2019-11-24 16:16:06 6986 11
原创 差分
题目描述:输入一个长度为n的整数序列。接下来输入m个操作,每个操作包含三个整数l, r, c,表示将序列中[l, r]之间的每个数加上c。请你输出进行完所有操作后的序列。输入格式:第一行包含两个整数n和m。第二行包含n个整数,表示整数序列。接下来m行,每行包含三个整数l,r,c,表示一个操作。输出格式:共一行,包含n个整数,表示最终序列。数据范围:1≤n,m≤100000,1≤l...
2019-11-20 20:33:44 176
原创 前缀和
问题描述,现在给定一个闭区间数组,求区间[l,r]的数据元素之和,询问m次,要求线性时间复杂度O(n)。比较常规的思路是使用循环遍历相加,但是一次循环的时间复杂度为O(n),m次询问最终的时间复杂度为O(n*m),显然是不满足要求的。我们可以采用空间换时间的策略,设置一个前缀和数组d,数组中任意位置i表示的是d[i] = a[1] + a[2] + … + a[i],经过这样的预处理,询问任意...
2019-11-20 19:28:01 177
原创 快速读入的技巧
在OJ上练习题目时,有些题目数据的输入非常大,即便是使用scanf()也会被卡常数,最后导致TLE。因此搜集网上的解决方案,常见的有以下两种:一、当数据量不是特别大的时间,此时可以关闭stdio的同步,使得cin,cout与printf, scanf一样快。核心代码:ios::sync_with_stdio(false)//此时注意在程序中不能再使用任何stdio的库函数,否则会造成混乱。...
2019-11-20 14:37:21 418
原创 求解逆序对的个数(由归并排序衍生出的O(nlogn)时间复杂度的算法)
逆序:在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一、暴力做法int count(int *a, int n) { int res = 0; for (int i=0; i<n-1; ++i) { for (int j=1; j<n; ++j) { if (a[i] > a[j]) res ++; } ...
2019-11-19 11:55:40 578
原创 严格m叉树(正则m叉树)
严格m叉树:只有度为0的节点和度为m的节点。如何构造正则m叉树:首先寻找N0节点的个数与Nm节点的个数之间的关系。(1)从节点个数看:N = N0 + Nm(2)从分支数看:N - 1 = mNm联立两个方程得:(m-1)*Nm = N0-1所以:Nm = (N0-1)/(m-1)开始时,有n个节点,即叶子节点有n个。计算Nm=(N0-1)%(m-1),如果Nm=0则说明刚刚好可以构造...
2019-11-13 09:50:31 4704 2
原创 链地址法处理hash冲突建立Hash表代码练习
给定一个数组x[] = {4, 1, 3, 7, 8, 22, 45, 75}, 哈希函数为H(key) = key*2 % 11,采用链地址法处理哈希冲突。建立哈希表:#include <bits/stdc++.h>using namespace std;const int maxsize = 11;//哈希函数int hash(int x) {return x*2 % ...
2019-11-11 09:50:13 537
原创 B-树查找算法的简单实现
B-树节点类定义struct node { int n; //关键字个数 int key[maxsize]; //关键字数组 node *ptr[maxsize+1]; //指向孩子节点的指针的数组};//在以root为根节点的B树中查找值为x的节点node *dfs(node *root, int x) { if (!root) return NULL; else { i...
2019-11-09 23:36:07 461
原创 八皇后--回溯法
#include <bits/stdc++.h>using namespace std;const int N=8;int chess[N][N];int cnt = 0;void init() { for (int i=0; i<N; ++i) { for (int j=0; j<N; ++j) chess[i][j] = 0; }}v...
2019-11-09 15:47:34 132
原创 前缀表达式(波兰表达式)的计算
波兰表达式也称之为前缀表达式,即运算符放置于操作数之前。计算波兰表达式的值的方法:(1)从后往前遍历表达式。(2)遇到数字直接入栈。(3)遇到运算符,取出两个数字,第一个作为操作数,第二作为被操作数,执行相应的运算。将运算的结果继续入栈。(4)当表达式遍历完时,此时栈顶元素即为计算结果。int cal(string s) { stack<int> st; for (i...
2019-11-09 09:55:27 1368
原创 单链表:删除带头结点递增有序单链表中开区间(a,b)的所有节点
struct node { int val; node *next;};void deleteBetweenMaxAndMin(node *head, int minv, int maxv) { node *p = head; node *q = head->next; node *premin = head, *premax = head; node *pmin ...
2019-11-09 09:06:32 1076
原创 二叉树:关于二叉树节点个数以及高度计算的相关问题以及其衍生问题
1.N个节点的二叉树的最低高度和最高高度?2.N个节点完全二叉树的最低高度或者最高高度?3.N个节点的m叉树的最小高度和最大高度?4.高度为h的完全二叉树最小有多少个节点,最多有多少个节点?5.给定完全二叉的节点个数,求完全二叉树叶子节点的个数?6.给定完全二叉树叶子节点的个数,求最多的节点个数?7.给定完全二叉树在某层有n个叶子节点,则完全二叉树的最多和最少节点个数?8.给定完全二...
2019-11-08 23:44:02 2589
原创 单链表:删除带头节点单链表中最小值所有在的节点
思路:用两对前驱和后继节点,分别比较当前节点的前驱和后继以及最小值界定啊的前驱和后继。遍历完整个链表,删除最小值节点即可。struct node { int val; node *next;};void deleteMin(node *head) { node *p = head, *q = head->next; node *premin = head, *pmin =...
2019-11-08 19:58:39 1034
原创 二叉树:统计二叉树同时拥有左右孩子节点的个数
二叉树遍历的应用struct node { int val; node *left, *right;};int dfs(node *root) { if (!root) return 0; if (root->left && root->right) return1; return dfs(root->left) + dfs(root->r...
2019-11-08 11:00:06 2650
原创 数据结构:三元组的定义(考研)
//非零元素的节点类的定义struct triple { int e; int col, row;};#define maxsize 100struct tripleMatrix { triple data[maxsize]; int m;//m行 int n;//n列 int size;//三元组中非零元素的总个数};注意:三元组在存储稀疏矩阵时,只有当稀疏矩阵的稀...
2019-11-08 10:17:38 6000 3
原创 二叉树:二叉树的最大路径和
二叉树的最大路径和,枚举二叉树的每一个节点,通过当前节点最大路径和是, 当前节点左子树的最大路径和+root->val+当前节点右子树的最大路径。struct node { int val; node *left, *right;};int ans = MIN_MAX;//用于维护最大路径和int dfs(node *root) { if (!root) return 0;...
2019-11-07 20:23:59 235
原创 二叉树:二叉树的直径
二叉树直径的定义:二叉树中路径的最大长度二叉树中路径的最大长度,可以理解所有节点的左右子树高度之和的最大值。假设二叉树有n个节点,编号为{a1,a2,…,an}, 其对应的左右子树的高度之和为H = {h1,h2,h3,…,hn}, 则该二叉树的直径为max(H)。struct node { int val; node *left, *right;};int ans = 0;// ...
2019-11-07 20:08:44 1542
原创 算法:判断字符串是否为回文串的三种方法(递归,循环,使用栈模拟递归)(考研)
一、递归bool ispalindrome(string s, int i, int j) { if (i >= j) return true; if (s[i] == s[j]) return ispalindrome(s, i+1, j-1); else return false;}二、使用栈模拟递归bool ispalindrome(string s) { int n...
2019-11-07 14:01:29 2467
原创 二叉树:前序、中序和后序遍历的方便记忆和应试非递归写法(考研)
前序遍历:struct node { int val; node *left,*right; };vector<int> preorder(node *root) { vector<int> res; if (!root) return res; stack<node*> st; auto p = root; while (p || st.s...
2019-11-07 08:48:07 201
原创 合并两个有序数组,要求时间复杂度为O(n),空间复杂度为O(1)
思路:因为数组已经是有序的,因此我们可以直接从两个数组的末位开始比较,将大的一个直接放到第一个数组的末尾,此时必须要求a数组的空间大小能够同时填充a数组和b数组的有效元素,然后依次比较两个数组元素的大小即可。代码实现:#include <bits/stdc++.h>void merge(int *a, int n, int *b, int m) { int i = n-1;/...
2019-11-03 20:50:23 2655 1
原创 二叉树:将二叉树中的所有节点的左右子树进行交换
二叉树遍历的简单应用struct node { int val; node *left, *right;};node *swapSubTree(node *root) { if (!root) return NULL; else { //交换的过程 node *tmp = root->left; root->left = root->right; ...
2019-11-03 19:37:05 4598
原创 单链表:在带头节点单链表中删除(minv, maxv)中的所有节点
链表节点删除,只有标记待删除节点的前驱节点即可;[注]:如果不是带有节点设置一个虚拟节点即可,返回时返回dummy->next。struct node { int val; node *next;};void delInterval(node *head, int minx, int maxx) { if (!head) return head; node *pre = h...
2019-11-03 19:20:44 552
原创 二叉树:计算叶子节点个数
叶子节点的特征:左右孩子均为NULLstruct node { int val; node *left, *right;};int countLeaf(node *root) { if (!root) return 0; else { if (!root->left && !root->right) return 1; return count...
2019-11-03 19:04:05 1486
原创 二叉树:前序与后序、前序与中序以及中序与后序相同、相反的特征
一、前序序列与后序序列1.前序序列和后序序列相同空树或者只有根节点的二叉树2.前序序列和后序序列相反(1)当且仅当二叉树中只有一个叶子节点(2)二叉树的高度和其节点个数相同二、前序序列与中序序列1.前序序列和中序序列相同任意节点没有左孩子节点2.前序序列和中序序列相反(1)任意节点没有右孩子节点(2)三、中序序列与后序序列1.中序序列和后序序列相同任意节点没有右孩子节点...
2019-11-02 07:35:47 28732 4
原创 判断两棵二叉树是否相同
struct node { int val; node *left, *right;};bool isSame(node *a, node *b) { if (!a && !b) return true; if ((!a && b) || (!b && a)) return false; if (a->val == b-&...
2019-11-01 10:04:52 889
LinkedListProblems.pdf
2019-10-29
Effective C++中文第三版高清
2018-08-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人