
数据结构
EloryDo
当你的才华还撑不起你的野心时,那你就应该静下心来学习。当你的经济还撑不起你的梦想时,那你就应该踏实的去工作!
展开
-
c++单调栈
单调栈一般用来求下一个最值问题,是LeetCode中常考的算法题。496. 下一个更大元素 I给你两个 没有重复元素 的数组nums1 和nums2,其中nums1是nums2的子集。请你找出 nums1中每个元素在nums2中的下一个比其大的值。nums1中数字x的下一个更大元素是指x在nums2中对应位置的右边的第一个比x大的元素。如果不存在,对应位置输出 -1 。//496. 下一个更大元素 I/*Next Greater Elem...原创 2021-07-05 14:22:24 · 806 阅读 · 0 评论 -
数组和链表实现Stack
数组的实现需要先开辟一定的理论空间capacity的数组 当实际空间size大于理论空间capacity时,需要重新分配空间大小 通过size来指向栈顶 压栈就是将新的数值放在size处,然后size++ 出栈就是将size处的数值返还,size--//ArrayStack.h#pragma once//栈的两种实现方法之数组实现template <typename T>class ArrayStack{public: ArrayStack(int cap);原创 2021-03-09 17:16:07 · 121 阅读 · 0 评论 -
二叉堆
二叉堆定义:二叉堆是完全二叉树或近似完全二叉树。二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左子树和右子树都是一个二叉堆。它分为两种:最大堆和最小堆。最大堆:父结点的键值总是大于或等于任何一个子节点的键值;最小堆:父结点的键值总是小于或等于任何一个子节点的键值。最大堆示意图,数组中的存储形式在下面插入插入的数值先放在堆的最后,然后与其父节点进行比较交换删除用最后的数值来替换需要删除的数值,然后与其子节点中最大的值比较交换.原创 2021-02-09 17:05:06 · 271 阅读 · 0 评论 -
红黑树详解
基础知识 红黑树是一种二叉搜索树,是AVL树的改进版。红黑树的生长是自底向上的,跟2-3树类似为啥引入红黑树:1、二插搜索树会出现退化成链表的情况,其时间复杂度为O(n)2、为防止二叉搜索树会退化成链表,引入了对左右子树的高度差有严格显示的AVL树。 AVL树的缺点: 因为对左右子树的高度差有严格的规定,所以其在插入和删除时会出现旋转,导致性能下降。这才有了对平衡概念不是很严格的红黑树红黑树与AVL树的比较1. AVL树的时间复杂度优于红黑树,但是对于现在的计算机,这...原创 2021-02-04 17:08:18 · 5985 阅读 · 0 评论 -
AVL树详解
AVLTree树AVL树的名字来源于它的发明作者G.M. Adelson-Velsky 和 E.M. Landis。AVL树是最先发明的自平衡二叉查找树(Self-Balancing Binary Search Tree,简称平衡二叉树)。 定义 1、必须是一颗二插搜索树2、每个节点的左右子树高度差最多为1 一些概念: 平衡因子:节点左子树的高度减去其右子树的高度成为该节点的平衡因子(BF)最小不平衡树:距离插入节点最近的,且左右平衡因子的绝对值大于1的节点下图中在节点5右子原创 2021-01-31 21:54:37 · 639 阅读 · 0 评论 -
完全二叉树
满二叉树所有节点的度要么为0,要么为2,且所有的叶子节点都在最后一层。1、第i层的节点数量为:2^{i-1}2、总节点数n = 2^h-1,h为高度这里说的满二叉树其实就是其他地方说的完美二叉树。完全二叉树叶子节点只会出现在最后2层,且最后一层的叶子节点都靠左对齐。相当于是一个数组,其从上到下,从左到右排列。1、根节点编号为N,则左孩子编号为2N+1,右孩子为2N+22、如果完全二叉树的左孩子编号为M,则根节点的编号为(M-1)/23、如果完全二叉树的右孩子编号为M,则根节点编号原创 2021-01-23 21:35:59 · 2270 阅读 · 0 评论 -
全排列算法(穷举、递归、字典序)
// Permutation.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include <iostream>#include <algorithm>#include <string>//全排列有三种思路来解决:暴力穷举、递归、字典序//暴力穷举//当数值很小的时候可以使用,但是数值很多的时候其时间复杂度就很高了n^nvoid ExhaustivePermutation(int *a, int len){ for .原创 2021-01-19 12:15:00 · 979 阅读 · 0 评论 -
有序二叉树的增删改查
//BinaraTree.h#pragma once#include <iostream>using namespace std;//升序二叉树//左节点 < 根节点 < 右节点struct Node{ Node *pLeft;//左节点 Node *pRight;//右节点 int data;//数值};class BinaryTree{public: BinaryTree(); ~BinaryTree(); Node* createNo...原创 2021-01-11 21:02:23 · 164 阅读 · 0 评论 -
N叉树的增删改查
一个N叉树至少需要三个指针,指向父节点的指针,指向第一个兄弟的指针,指向第一个孩子的指针。默认除第一个孩子外其他的孩子没有孩子仅限熟悉N叉树使用。//NTree.h#pragma once#include <iostream>#include<memory>//创建一颗N叉树最少需要三个指针,向上、向下、向右三个方向的指针,即://分别是指向父节点、指向当前节点的第一个孩子、指向当前节点的第一个兄弟template <class T>原创 2021-01-08 18:29:35 · 605 阅读 · 0 评论 -
常见排序算法
#include <iostream>void print(int *arr, int n){ for (int i = 0; i < n; i++) { std::cout << arr[i] << " "; } std::cout << std::endl;}//往有序数组中插入数据tmp,tmp与该数组进行比较,//若tmp小于数组中的某一数值,则tmp插入到该数值的位置,该数值之后的后移//1、从第二个元素(tmp).原创 2021-01-05 21:22:36 · 127 阅读 · 0 评论