数据结构
数据结构相关代码
殇&璃
这个作者很懒,什么都没留下…
展开
-
排序
#include"sort.h"//交换void Swap(int* arr, int left, int right) { int tmp = arr[left]; arr[left] = arr[right]; arr[right] = tmp;}/*时间复杂度 : 最坏O(n^2) 平均O(n^2) 最好O(n)空间复杂度 : O(1)稳定性 : 稳定数据敏感性(即数据的排序与否对算法的影响) : 敏感*/ //插入排序void insertSort(int*原创 2020-06-22 15:51:03 · 111 阅读 · 0 评论 -
二叉树的实现, 遍历(递归, 非递归, 层序)
#include"binaryTree.h"#include"stack.h"#include"queue.h"// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树BTNode* BinaryTreeCreate(BTDataType* str, int* idx) { if (str[*idx] != '#') { //不是空数, 创建结点 BTNode* root = (BTNode*)malloc(sizeof(BTNode)); root->_dat原创 2020-05-25 17:37:48 · 118 阅读 · 0 评论 -
前序构建二叉树并中序输出
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>//前定义一个树结点typedef struct Node{ struct Node* left; struct Node* right; char val;}Node;//给一个字符数组str 和 索引idxNode* CreatTree(char* str, int* idx){ if (str[原创 2020-05-22 18:57:47 · 99 阅读 · 0 评论 -
判断是否为平衡二叉树
#include<stdio.h>#include<stdbool.h>//Definition for a binary tree node.struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right;};//获取结点的高度int getH(struct TreeNode* root) { if (root == NULL) retu原创 2020-05-22 16:41:36 · 95 阅读 · 0 评论 -
判断一棵树是否为另一棵树的子树
#include<stdio.h>#include<stdbool.h>//Definition for a binary tree node.struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right;};bool isSameTree(struct TreeNode* p, struct TreeNode* q) { //同时为空说明结构相同原创 2020-05-19 12:23:57 · 153 阅读 · 0 评论 -
对称二叉树
#include<stdio.h>#include<stdbool.h>//Definition for a binary tree node.struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right;};bool isSy(struct TreeNode* p, struct TreeNode* q) { //同时为空说明结构相同 if (.原创 2020-05-19 12:06:58 · 65 阅读 · 0 评论 -
判断两棵树是否相同
#include<stdio.h>#include<stdbool.h>//Definition for a binary tree node.struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right;};bool isSameTree(struct TreeNode* p, struct TreeNode* q) { //同时为空说明结构相同原创 2020-05-19 11:36:08 · 379 阅读 · 0 评论 -
翻转二叉树
#include<stdio.h>//Definition for a binary tree node.struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right;};void reverseT(struct TreeNode* root) { if (root == NULL) return; //叶子节点就不用翻转了 if (ro原创 2020-05-19 11:35:30 · 108 阅读 · 0 评论 -
二叉树的最大深度
#include<stdio.h>#include<stdlib.h> //Definition for a binary tree node. struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; //第一种写法 int Max(int a, int b) { if (a > b) return a;原创 2020-05-19 11:11:33 · 121 阅读 · 0 评论 -
单值二叉树
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回 false。#include<stdio.h>#include<stdbool.h>//Definition for a binary tree node.struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right;};bool order(原创 2020-05-19 10:37:35 · 279 阅读 · 0 评论 -
二叉树的后序遍历
#include<stdio.h>#include<stdlib.h>//Definition for a binary tree node.struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right;}; /** * Note: The returned array must be malloced, assume caller calls free().原创 2020-05-19 10:02:06 · 100 阅读 · 0 评论 -
二叉树的中序遍历
#include<stdio.h>#include<stdlib.h>//Definition for a binary tree node.struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right;}; /** * Note: The returned array must be malloced, assume caller calls free().原创 2020-05-19 09:59:15 · 118 阅读 · 0 评论 -
二叉树的前序遍历
#include<stdio.h>#include<stdlib.h>//Definition for a binary tree node.struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right;}; /** * Note: The returned array must be malloced, assume caller calls free()原创 2020-05-19 09:55:29 · 115 阅读 · 0 评论 -
堆的相关操作, 堆排序和TopK问题
#include"heap.h"void Swap(HPDataType* array, int left, int right) { HPDataType tmp = array[left]; array[left] = array[right]; array[right] = tmp;}//建堆void heapCreat(Heap* hp, HPDataType* array, int size) { //先把信息填入堆中 (结构体) hp->array = (HPData原创 2020-05-19 09:35:15 · 77 阅读 · 0 评论 -
括号匹配问题
typedef char DataType;typedef struct Stack { DataType* arr; int size; int capacity;}Stack;//初始化void StackInit(Stack* st, int n) { //创建一个n个元素的栈 st->size = 0; st->capacity = n; st->arr = (DataType*)malloc(sizeof(Da原创 2020-05-19 09:33:11 · 111 阅读 · 0 评论 -
用队列实现栈
typedef int DataType;typedef struct QNode { DataType data; struct QNode* next;}QNode;typedef struct Queue { QNode* front; QNode* rear; int size;}Queue;//初始化void QueueInit(Queue* q) { q->front = q->rear = NULL; q-原创 2020-05-19 09:32:24 · 90 阅读 · 0 评论 -
用栈实现队列
typedef int DataType;typedef struct Stack { DataType* arr; int size; int capacity;}Stack;//初始化void StackInit(Stack* st, int n) { //创建一个n个元素的栈 st->size = 0; st->capacity = n; st->arr = (DataType*)malloc(sizeof(Dat原创 2020-05-19 09:31:56 · 73 阅读 · 0 评论 -
循环队列
typedef struct { int* arr; int front; int rear; int size; int capacity;} MyCircularQueue;/**&原创 2020-05-19 09:30:46 · 101 阅读 · 0 评论 -
队列的实现
#include<stdio.h>#include<stdlib.h>typedef int DataType;typedef struct QNode { DataType data; struct QNode* next;}QNode;typedef struct Queue { QNode* front; QNode* rear; int siz...原创 2020-04-10 18:01:03 · 69 阅读 · 0 评论 -
顺序栈的实现
#include<stdio.h>#include<stdlib.h>typedef int DataType;typedef struct Stack { DataType* arr; int size; int capacity;}Stack;//初始化void StackInit(Stack* st, int n) { //创建一个n个元素的栈...原创 2020-04-10 12:20:23 · 140 阅读 · 1 评论 -
带头双向循环链表的增删查改
#include<stdio.h>#include<stdlib.h>typedef int DataType;typedef struct Node { int data; struct Node* next; struct Node* prev;}Node;typedef struct List { Node* header;}List;//初...原创 2020-04-08 10:21:01 · 129 阅读 · 0 评论 -
对链表进行插入排序
struct ListNode* insertionSortList(struct ListNode* head){ if (head == NULL || head->next == NULL) return head; struct ListNode* cur, *prev, *start, *newH; prev = head; cur ...原创 2020-04-07 11:34:59 · 80 阅读 · 0 评论 -
复制带随机指针的链表
struct Node { int val; struct Node *next; struct Node *random; };struct Node* copyRandomList(struct Node* head) { if(head == NULL) return NULL; struct Node* cur, *copy, ...原创 2020-04-05 11:15:59 · 81 阅读 · 0 评论 -
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
// 如果链表中有环的话, 那么fast和slow必然会在环内相遇// 我们设从头到换入口的距离为L, 环的长度为C, 环入到相遇点的距离为X// 那么我们可以知道: // fast走过的距离为 : L + X + N * C// slow走过的距离为 : L + X// 并且我们知道fast走过的距离是slow的两倍// 所以有 : 2 * (L + X) = L + X ...原创 2020-04-05 10:41:23 · 205 阅读 · 0 评论 -
判断链表中是否有环
bool hasCycle(struct ListNode *head) { if (head == NULL) { return false; } struct ListNode* fast, *slow; fast = slow = head; while (fast!= NULL && fast->next != ...原创 2020-04-05 10:14:05 · 102 阅读 · 0 评论 -
找到两个单链表相交的起始节点
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) { int lenA = 0; int lenB = 0; struct ListNode* cur1 = headA; struct ListNode* cur2 = headB; //...原创 2020-04-05 10:00:45 · 114 阅读 · 0 评论 -
链表的回文结构
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。 给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。//这种方法的思路就是先用快慢指针找到链表的中间位置//然后翻转后半段链表//最后依次比较即可 bool chkPalindrome(ListNode* A) { // ...原创 2020-04-05 09:25:46 · 93 阅读 · 0 评论 -
分割链表
编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。 ListNode* partition(ListNode* pHead, int x) { // write code herew if (pH...原创 2020-04-04 21:13:29 · 78 阅读 · 0 评论 -
合并两个有序链表
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。输入:1->2->4, 1->3->4输出:1->1->2->3->4->4/** * Definition for singly-linked list. * struct ListNode { * int val; * ...原创 2020-04-04 21:02:08 · 68 阅读 · 2 评论 -
单链表的增删查改(不带头单向非循环链表)
#include<stdio.h>#include<stdlib.h>typedef int DataType;typedef struct Node { DataType data; struct Node* next;}Node;typedef struct SinglgList { Node* head;}SinglgList;void S...原创 2020-04-01 09:19:03 · 87 阅读 · 0 评论 -
单链表的增删查改(不带头单向非循环链表)
#include<stdio.h>#include<stdlib.h>typedef int DataType;typedef struct Node { DataType data; struct Node* next;}Node;typedef struct SinglgList { Node* head;}SinglgList;void S...原创 2020-03-31 23:28:43 · 114 阅读 · 0 评论 -
顺序表的增删改查
#include<stdio.h>#include<stdlib.h>#include<assert.h>typedef int DataType;typedef struct SqList{ DataType* arr; int size; int capacity;}SqList;//顺序表初始化void SqListInit(S...原创 2020-03-29 11:30:38 · 246 阅读 · 0 评论