数据结构
TANGYRun
学习是一种习惯和坚持,越努力越幸运
展开
-
常见八大排序算法的分析实现与总结
排序的概念在实现排序算法之前,我们需要对排序的相关概念有一个清楚的理解。排序:排序就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假设在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序之后的序列中,r[i]仍在r[j]之前,则称这种排序算...原创 2020-02-23 12:03:06 · 398 阅读 · 0 评论 -
另一个树的子树(OJ)
给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。本题主要运用递归的思想:/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeN...原创 2019-01-01 16:21:56 · 131 阅读 · 0 评论 -
二叉树的最大深度(OJ)
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *r...原创 2019-01-01 16:42:53 · 320 阅读 · 0 评论 -
对称二叉树(OJ)
给定一个二叉树,检查它是否是镜像对称的。/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */bool _isSymmetric(struct Tree...原创 2019-01-01 17:21:48 · 107 阅读 · 0 评论 -
平衡二叉树(OJ)
给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct Tree...原创 2019-01-01 17:44:06 · 219 阅读 · 0 评论 -
二叉树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*...原创 2019-01-06 17:55:46 · 1143 阅读 · 1 评论 -
根据二叉树创建字符串
你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。示例 1:输入: 二叉树: [1,2,3,4]1/ 2 3/4输出: “1(2(4))(3)”解释: 原本将是“1(2(4)())(3())”,在你省略所有不必要的空括号对之后,...原创 2019-01-06 17:59:08 · 395 阅读 · 0 评论 -
二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]示例 1:输入: root = [3,5,1,6,...原创 2019-01-06 18:06:20 · 646 阅读 · 2 评论 -
快速排序(递归)
1.hoare版本int PartSort1(int* a,int begin,int end)//hoare版本{ int key = begin;//把第一个位置设成关键字 while (begin < end) { //从后面选比关键字小的,如果关键字小于末尾的数,end往前走 while (begin < end && a[key] <...原创 2019-01-11 18:57:09 · 316 阅读 · 0 评论 -
快速排序(非递归)
需要借助栈typedef int STDatatype;typedef struct Stack{ STDatatype* _a; int _top;//栈顶 int _capacity;//容量}Stack;void StackInit(Stack* ps){ assert(ps); ps->_a = NULL; ps->_capacity = 0; ps-...原创 2019-01-11 19:01:03 · 1361 阅读 · 0 评论 -
归并排序
void _MergeSort(int* a, int begin, int end, int* tmp){ if (begin >= end) { return; } int mid = begin + ((end - begin) >> 1); //递归左区间 _MergeSort(a, begin, mid, tmp); //递归右区间 _MergeS...原创 2019-01-11 19:02:34 · 88 阅读 · 0 评论 -
计数排序
void CountSort(int* a, int n){ int max = a[0]; int min = a[0]; //for循环找到原数组中的最大值和最小值 for (int i = 0; i < n; i++) { if (a[i]>max) { max = a[i]; } if (a[i] < min) { min = ...原创 2019-01-11 19:04:28 · 91 阅读 · 0 评论 -
插入排序、希尔排序、选择排序、堆排序、冒泡排序的实现
插入排序基本思想:插入排序就是将待插入的数据与已经有序的序列中的数据进行比较。如果是升序排列:刚开始的第一个元素默认为有序即为a[end],此时end=0,然后将要插入的数据a[end+1]与a[end]进行比较,如果a[end]&gt;a[end+1],就交换,–end,循环次操作,直到插入的数据与前面已经有序的最后一个数据都大时,再让end++。循环以上操作,直到所有数据都是升序排序...原创 2019-01-09 17:46:10 · 312 阅读 · 0 评论 -
二叉搜索树的实现(C++)
二叉搜索树又称为二叉排序树,它可能是一棵空树,亦或是一棵具有以下性质的二叉树:若它的左子树不为空,则左子树上所有结点的值都小于根结点的值。 若它的右子树不为空,则右子树上所有结点的值都大于根结点的值。 它的左右子树也分别为二叉搜索树。二叉搜索树的操作1.二叉搜索树的查找实现思路:若结点不为空:如果结点的值key == 查找的key,返回该结点;如果结点的值key ...原创 2019-04-19 21:41:46 · 2411 阅读 · 0 评论 -
二叉树基本接口的实现
首先声明结构体#pragma once#include&lt;stdio.h&gt;#include&lt;malloc.h&gt;#include&lt;stdlib.h&gt;#include&lt;assert.h&gt;typedef char BTDataType;typedef struct BinaryTreeNode{ BTDat原创 2019-01-05 17:57:26 · 264 阅读 · 0 评论 -
最小栈
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。push(x) – 将元素 x 推入栈中。pop() – 删除栈顶的元素。top() – 获取栈顶元素。getMin() – 检索栈中的最小元素。示例:MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minS...原创 2019-01-10 19:03:41 · 90 阅读 · 0 评论 -
单链表接口的实现
SList.h#ifndef __TEST_H__#define __TEST_H__#include<stdio.h>#include<assert.h>#include<stdlib.h>#include<malloc.h>typedef int SLTDataType;typedef struct SListNode{ S...原创 2019-01-03 15:43:09 · 208 阅读 · 0 评论 -
带头双向链表接口的实现
List.h#pragma once#include<stdio.h>#include<malloc.h>#include<stdlib.h>#include<assert.h>typedef int LTDataType;typedef struct ListNode{ LTDataType _data; struct Lis...原创 2019-01-03 15:51:36 · 185 阅读 · 0 评论 -
移除链表元素(OJ)
删除链表中等于给定值 val 的所有节点。示例:输入: 1-&gt;2-&gt;6-&gt;3-&gt;4-&gt;5-&gt;6, val = 6输出: 1-&gt;2-&gt;3-&gt;4-&gt;5/** * Definition for singly-linked list. * struct ListNode {原创 2019-01-03 15:58:28 · 281 阅读 · 0 评论 -
反转链表(OJ)
反转一个单链表。示例:输入: 1-&gt;2-&gt;3-&gt;4-&gt;5-&gt;NULL输出: 5-&gt;4-&gt;3-&gt;2-&gt;1-&gt;NULL/** * Definition for singly-linked list. * struct ListNode { * int val;原创 2019-01-03 16:02:44 · 443 阅读 · 0 评论 -
链表的中间结点(OJ)
给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode* middleNod...原创 2019-01-03 16:05:25 · 283 阅读 · 0 评论 -
链表中倒数第k个结点(OJ)
输入一个链表,输出该链表中倒数第k个结点。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* FindKthToTail(ListNode* pListHead...原创 2019-01-03 16:08:15 · 217 阅读 · 0 评论 -
堆的代码实现
Heap.h#include<stdio.h>#include<assert.h>#include<malloc.h>#include<stdlib.h>#include<string.h>typedef int HPDataType;typedef struct Heap{ HPDataType* _array; ...原创 2019-01-03 16:16:28 · 318 阅读 · 0 评论 -
链表部分面试题(OJ)
1.编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x),...原创 2018-12-30 17:51:24 · 186 阅读 · 0 评论 -
二叉树中先序遍历、中序遍历、后序遍历(OJ)
1.给定一个二叉树,返回它的 前序 遍历。示例:输入: [1,null,2,3]12/3输出: [1,2,3]/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *rig...原创 2018-12-30 18:06:16 · 340 阅读 · 0 评论 -
判断相同二叉树(OJ)
给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; ...原创 2018-12-30 18:07:53 · 422 阅读 · 0 评论 -
有效的括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: “()”输出: true示例 2:输入: “()[]{}”输出: true示例 3:输入: “(]”输出: false示例 4:输入: “([)...原创 2019-01-10 18:56:41 · 110 阅读 · 0 评论 -
用队列实现栈
使用队列实现栈的下列操作:push(x) – 元素 x 入栈pop() – 移除栈顶元素top() – 获取栈顶元素empty() – 返回栈是否为空注意:你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。你所使用的语言也许不支持队列。 你可以使用 list 或者 deque...原创 2019-01-10 19:00:08 · 383 阅读 · 0 评论 -
用栈实现队列
使用栈实现队列的下列操作:push(x) – 将一个元素放入队列的尾部。pop() – 从队列首部移除元素。peek() – 返回队列首部的元素。empty() – 返回队列是否为空。示例:MyQueue queue = new MyQueue();queue.push(1);queue.push(2);queue.peek(); // 返回 1queue.pop(); ...原创 2019-01-10 19:02:17 · 445 阅读 · 0 评论 -
顺序表动态存储及其接口的实现
顺序表的存储有两种方式:静态存储和动态存储。静态存储开辟的是一个定长的空间,它只适用确定知道需要存储多少数据的场景。静态顺序表的定长数组开多了浪费,开少了不够用。所有在大多数情况下都是使用动态顺序表,根据需要动态分配空间大小。下面是对动态顺序表的实现:SeqList.h#ifndef __TEST_H__#define __TEST_H__#include<stdio.h>...原创 2018-12-22 19:52:41 · 206 阅读 · 0 评论