数据结构和算法
数据结构和算法相关
幼、稚%
这个作者很懒,什么都没留下…
展开
-
一文搞定哈希表
哈希表(Hash Table)概念不经过任何比较,一次直接从表中得到要搜索的元素。 如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。向该结构中插入元素时:根据待插入元素的关键码,以此函数计算出该元素的存储位置。在该结构中搜索元素时:对元素的关键码进行同样的计算,把求得的函数值当做元素的存储位置,在结构中寻找此位置的元素与欲查找的元素的关键码比较,若相等则代表搜索成功上述方式即为哈希方法,此方法中原创 2020-09-19 17:13:00 · 138 阅读 · 0 评论 -
攻克红黑树
红黑树性质每个节点只有红色或者黑色两种情况根节点一定是黑色如果一个节点是红色,那么它的两个子节点一定是黑色对于每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点每一个叶子节点都是黑色(可以为nullptr)由上述特点可以的出,红黑树的最长路径不超过最短路径的两倍最长路径:最长的情况是红黑相间,红黑节点个数相同(节点个数=黑色个数*2)最短路径:最短的情况是只有黑色节点,与最长路径黑色节点个数相同所谓的红黑树,本身也就是双色树,颜色只是观察其特点,并不局限与红黑原创 2020-09-13 15:21:27 · 234 阅读 · 1 评论 -
红黑树的基础——AVL树
AVL树特点:前提:是一棵二叉搜索树左右子树高度之差(简称为平衡因子)的绝对值不超过1左右子树也是一颗AVL树AVL树避免了一般二叉搜索树会出现单边树的情况代码定义template<class T>//定义节点struct AVLNode { T _val; int _bf;//平衡因子 AVLNode<T>* _left; AVLNode<T>* _right; AVLNode<T>* _parent; AVLNode(con原创 2020-09-12 17:53:54 · 113 阅读 · 0 评论 -
解析二叉搜索树
二叉搜索树概念二叉搜索树又称为二叉排序树(可以是一棵空树)一般具有以下性质1.若左子树不为空,则左子树上的所有节点的值均小于(大于)根节点的值2.若右子树不为空,则右子树上的所有节点的值均大于(小于)根节点的值3.左右子树的结构以满足上述性质4.二叉搜索树一般不存在值相同的节点代码定义template <class T>//定义结点的结构体struct BSTNode{ T _val; BSTNode<T>* _left; BSTNode<T>原创 2020-09-10 11:42:47 · 261 阅读 · 0 评论 -
几种排序方法总结
交换函数//交换函数void Swap(int* array, int i,int j) { int tmp = 0; tmp = array[i]; array[i] = array[j]; array[j] = tmp;}冒泡排序时间复杂度:最坏O(n^2) 平均O(n^2) 最好O(n)空间复杂度:O(1)稳定性:稳定数据敏感:敏感void bubbleSort(...原创 2020-04-29 15:18:59 · 350 阅读 · 1 评论 -
二叉树的实现
typedef char BTDataType;typedef struct BinaryTreeNode{ BTDataType _data; struct BinaryTreeNode* _left; struct BinaryTreeNode* _right;}BTNode;// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树BTNode...原创 2020-04-26 20:58:46 · 114 阅读 · 0 评论 -
判断一棵树是否是平衡二叉树
平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。//获取树的高度int maxDepth(struct TreeNode* root){ if(root == NULL) return 0; ...原创 2020-04-25 21:33:18 · 162 阅读 · 0 评论 -
二叉树的构建和遍历
二叉树定义typedef struct BTNode{ char _data; struct BTNode* _left; struct BTNode* _right;}BTNode;中序遍历void Inorder(BTNode* root){ if(root){ Inorder(root->_left); prin...原创 2020-04-25 21:15:43 · 133 阅读 · 0 评论 -
堆的实现及相关操作
堆:是一种特殊的完全二叉树大堆:左右孩子结点均小于父亲结点小堆:左右孩子结点均大于父亲结点用顺序表来表示堆typedef int HPDataType;typedef struct Heap{ HPDataType* _array; int _size; int _capacity;}Heap;堆的创建void heapCreat(Heap* hp,HPDataType*...原创 2020-04-22 10:42:22 · 117 阅读 · 0 评论 -
用队列实现栈
解题思路:此题可以用两个队列去实现一个栈,每次始终保持一个队列为空,入栈操作相当于给非空队列进行入队操作出栈操作相当于非空队列的队尾元素出队,此时需要把非空队列除最后一个元素之外的其余元素入队到空队列,然后出队最后一个队尾元素队列相关操作:https://blog.csdn.net/Immaturecld/article/details/105441519typedef struct {...原创 2020-04-13 20:23:28 · 128 阅读 · 0 评论 -
用栈实现队列
解题思路:此题可以用两个栈实现,一个栈进行入队操作,另一个栈进行出队操作出队操作: 当出队的栈不为空是,直接进行出栈操作,如果为空,需要把入队的栈元素全部导入到出队的栈,然后再进行出栈操作栈的相关操作:https://blog.csdn.net/Immaturecld/article/details/105441167typedef struct { //入队栈 Stack...原创 2020-04-13 20:04:45 · 99 阅读 · 0 评论 -
设计循环队列
解题思路:通过一个定长数组实现循环队列入队:首先要判断队列是否已满,再进行入队的操作,入队操作需要考虑索引循环的问题,当索引越界,需要让它变成最小值出队:首先要判断队列是否为空,再进行出队操作,出队也需要考虑索引循环的问题判空: 队头 == 队尾判满: 队尾 + 1 == 队头typedef struct { int* queue; int front; int...原创 2020-04-13 19:46:46 · 110 阅读 · 0 评论 -
队列(链表实现)及其相关操作
队列一种特殊的表特殊之处:插入时只能在表尾插入,出表时只能在表头取出,也就是(先进先出)队列的定义(链表实现)typedef int QDataType;typedef struct QNode{ struct QNode* _next; QDataType _data;}QNode;typedef struct Queue{ QNode* _front;//头指针 Q...原创 2020-04-10 20:49:05 · 149 阅读 · 0 评论 -
栈(顺序表实现)及其相关操作
栈一种特殊的表其特殊之处在于,插入时只能从表尾插入,出表时也只能从表尾取出,也就是后进先出栈的定义(顺序表实现)typedef int Type;typedef struct Stack{ Type* _array; size_t _size;//当前有效元素个数 size_t _capacity;//栈的最大容量}Stack;初始化void stackInit(Stack...原创 2020-04-10 20:31:46 · 154 阅读 · 0 评论 -
链表插入排序
算法(升序):让一个数跟它前面的数字进行比较,直到找到第一个比它小的数字,放在这个数字的后面/* Definition for singly-linked list. struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; ...原创 2020-04-06 15:20:21 · 141 阅读 · 0 评论 -
双向链表及其相关操作
双向循环链表每一个结点都有两个指针,一个前驱一个后继,头结点的前驱指向最后一个结点,最后一个结点的后继指向头结点结构体定义typedef int Type;//结点定义typedef struct Node{ Type _data; struct Node* _next; struct Node* _prev;}Node;//链表定义typedef struct List{...原创 2020-04-06 13:29:42 · 112 阅读 · 0 评论 -
链表及相关操作
链表链表结构体的定义typedef int Type;typedef struct Node{ struct Node* _next; Type _data;}Node;typedef struct SingleList{ Node* _head; // head: 表示链表真正的头结点,即第一个有效的数据的位置}SingleList;//上面的两个结构体共同组成一个链表...原创 2020-04-02 16:34:28 · 100 阅读 · 0 评论 -
顺序表相关面试题
1.原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1)int removeElement(int* nums, int numsSize, int val){ int* newA = (int*)malloc(numsSize * sizeof(int)); int idx = 0; for (int i = 0; i < numsSiz...原创 2020-03-28 20:51:06 · 157 阅读 · 0 评论 -
顺序表的相关操作实现(C语言)
顺序表的定义typedef int DataType;typedef struct seqList{ DataType* _array; size_t _size;//unsigned int _size, 元素个数 size_t _capacity; //容量:当前可用空间 //unsigned int _capacity;}seqList;初始化void seqListIn...原创 2020-03-28 20:45:51 · 162 阅读 · 0 评论