C++算法
文章平均质量分 51
sp_13230409636
这个作者很懒,什么都没留下…
展开
-
268-C++ 红黑树RBTree
最下面的黑色节点是哨兵节点通常面试的时候都不给出头节点,有头节点会使红黑树变的更加容易红黑树能不能给出三种颜色?就相当于是AVL树,AVL树是三种状态RB树只要求是大致平衡的,不想AVL树是完全平衡的下面两个图是等价的,所有路径都包含相同数目的黑色节点每次新建节点的默认颜色都是红色typedef enum {RED = 0,BLACK = 1}ColorType;typedef int KeyType;typedef struct rb_node{ rb_node* lef.原创 2022-03-20 11:51:29 · 919 阅读 · 0 评论 -
267-C++ AVL树
1.AVL树和红黑树都是二叉搜索树2.AVL树的定义左单旋完整代码//左单旋void RotateLeft(AVLTree& tree, AVLNode* ptr){ AVLNode* newroot = ptr->rightchild;//新根 newroot->parent = ptr->parent; ptr->rightchild = newroot->leftchild;//1 if (newroot-&原创 2022-03-19 16:40:40 · 917 阅读 · 0 评论 -
266-C++ 二叉树
1.判断是否为完全二叉树的方法,先将根节点(A)入队,队列不为空,将A出队,将A的左右孩子(BC)入队,队列不为空,将A的左孩子(B)出队,将A的左孩子的左右孩子(DE)入队,队列不为空,将A的右孩子©出队,将A的右孩子的左右孩子(FG)入队,队列不为空,将A的左孩子的左孩子(D)出队,将A的左孩子的左孩子的左右孩子(H空)入队,队列不为空,将A的左孩子的右孩子(E)出队,将A的左孩子的右孩子的左右孩子(空I)入队,队列不为空,将A的右孩子的左孩子(F)出队,将A的右孩子的左孩子的左右孩子(空空)入队,队列原创 2022-03-19 12:36:51 · 609 阅读 · 0 评论 -
265-C++ 二叉树代码
typedef char ElemType;typedef struct BtNode//BinaryTreeNode{ ElemType data; struct BtNode* leftchild; struct BtNode* rightchild;}BtNode,*BinaryTree;struct StkNode{ BtNode* pnode; int pos;public: StkNode(BtNode* p) :pnode(p), p原创 2022-03-18 19:33:15 · 480 阅读 · 0 评论 -
264-C++ 二叉树
1.树的定义二叉树是最简单的树形结构如果一个节点的左孩子是一个棵满二叉树,它的右孩子也是一棵满二叉树,那么这棵树是否一定是一个满二叉树?答案:不一定这种情况就不是一颗满二叉树如果一个节点的左孩子是一个棵完全二叉树,它的右孩子也是一棵完全二叉树,那么这棵树是否一定是一个完全二叉树呢?答案:不一定如果是满二叉树,可以用顺序表存储,如果是普通二叉树,使用顺序表浪费的空间很多,所以一般不使用顺序表存储普通二叉树三叉链表的存储密度要比二叉链表的存储密度要小原因是三叉链表要有三原创 2022-03-18 15:24:26 · 482 阅读 · 0 评论 -
263-C++ 矩阵连乘
1.m[i:j] = m[i:k] + m[k+1:j] + xxxxxx是只m[i:k]的新产生的矩阵和m[k+1:j]新产生的矩阵的乘积2.代码void Print_Vec(vector<vector<int>>& m){ int n = m.size(); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) {原创 2022-03-18 11:14:52 · 294 阅读 · 0 评论 -
255-C++ 动态规划 01背包问题
1.递归写法//递归方法int Knapsack(vector<int> w, vector<int> v, int i, int j, int n){ if (i == n) //只有一个物品 { return j >= w[i] ? v[i] : 0; } else { if (j < w[i]) //不装 return Knapsack(w, v, i + 1, j, n); else //装 { int maxv1 =原创 2022-03-14 21:02:32 · 1160 阅读 · 0 评论 -
229-C++斐波那契数列递归非递归写法
1.有一对兔子,从出生第3个月起每个月都生一对兔子,小兔子长到第3个月后每个月又生一对兔子,假如兔子都不死,问第24个月的兔子总数有多少对?面试中经常问如果解决斐波那契数列中重复计算的问题?答案:使用单个变量①非递归写法(数组方式)int fun(int n){ if (n <= 2) return 1; int* ar = new int[n + 1]; //下标0不用,从下标1开始 ar[1] = 1; ar[2] = 1; for (int i = 3; i <= n;原创 2022-03-05 10:36:20 · 633 阅读 · 0 评论 -
227-C++动态规划
1.动态规划动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。若用分治法解这类问题,则分解得到的子问题数目太多,以至于最后解决原问题需要耗费指数时间。然而,不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算,从而得到多项式时间算法原创 2022-03-04 17:12:00 · 532 阅读 · 0 评论 -
218-C++最接近点对问题
1.寻找最小差值问题(最接近点对问题)在一维空间中,可以通过从小到大排序,然后分别算出s1-s0,s2-s1,s3-s2,…,sn-sn-1,分别比较它们的大小,可以得出最小值,但是它只适用于一维空间中,不适用于二维(平面)和三维(空间),所以可以采用分治策略的思想算法:按照中位数划分成s1和s2区域,就可以使两边的区域的数据个数基本相当,从而使时间复杂度最小(O(nlogn)),在s1、s2中分别找到最小值(d1、d2),还需要找到s1区域的最大值Max,s2区域的最小值Min,然后求d1、d2、Mi原创 2022-02-27 18:35:31 · 810 阅读 · 0 评论 -
209-C++分治策略与递归
1.分治策略:是指将大规模分割成小规模,问题不变,规模变小,这自然导致递归过程的产生,分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法递归:若一个函数直接的或简介的调用自己,则称这个函数是递归的函数(简单的描述为自己调用自己)注意:不要写间接递归,更多的程序都是直接递归,即自己调用自己分治法能够解决的问题一般具有以下四个特征:①该问题的规模缩小到一定的程度就可以容易的解决②该问题可以分解为若干个规模较小的相同问题③使用小规模的解,可以合并成,该问题原规模的解④该问题原创 2022-02-21 11:58:49 · 538 阅读 · 0 评论