
数据结构
lMonster81
淡泊以明志,宁静以致远
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
七大排序总结
图片来自:https://www.cnblogs.com/DswCnblog/p/5629165.html 七大排序中只有冒泡,归并,插入是稳定排序。 代码实现: #include <algorithm> #include <bitset> #include <cmath> #include <cstdio> #include...原创 2019-03-04 19:44:36 · 230 阅读 · 0 评论 -
Leetcode129. Sum Root to Leaf Numbers求根到叶子节点数字之和
给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。 例如,从根到叶子节点路径 1->2->3 代表数字 123。 计算从根到叶子节点生成的所有数字之和。 说明: 叶子节点是指没有子节点的节点。 示例 1: 输入: [1,2,3] 1 / \ 2 3 输出: 25 解释: 从根到叶子节点路径 1->2 代表数字 12. 从根到...原创 2018-11-27 22:12:37 · 196 阅读 · 0 评论 -
Leetcode116. Populating Next Right Pointers in Each Node填充同一层的兄弟节点
给定一个二叉树 struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。 初始状态下,所有 next 指针都被设置为 NULL。 说明: 你只能使用额...原创 2018-11-27 22:11:56 · 147 阅读 · 0 评论 -
Leetcode114. Flatten Binary Tree to Linked List二叉树展开为链表
给定一个二叉树,原地将它展开为链表。 例如,给定二叉树 1 / \ 2 5 / \ \ 3 4 6 将其展开为: 1 \ 2 \ 3 \ 4 \ 5 \ 6 class Solution { public: TreeNode *last = NULL; void flatten(TreeNode* root) { if(root == ...原创 2018-11-27 22:11:02 · 126 阅读 · 0 评论 -
Leetcode113. Path Sum II路径总和2
给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。 说明: 叶子节点是指没有子节点的节点。 示例: 给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1 返回: [ [5,4,11,2], [5,8,4,5] ] class Solution { pub...原创 2018-11-27 22:10:11 · 185 阅读 · 0 评论 -
二叉树三种遍历两种方法(递归和迭代)
树结构的定义: struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; 前序遍历: 递归: class Solution { public: vector<i...原创 2018-12-04 20:59:57 · 419 阅读 · 1 评论 -
Leetcode145. Binary Tree Postorder Traversal二叉树的后序遍历
给定一个二叉树,返回它的 后序 遍历。 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 递归: class Solution { public: vector<int> res; vector<int> postorderTraversal(TreeNode* root) { if(root == NULL) ...原创 2018-12-04 20:35:54 · 143 阅读 · 0 评论 -
Leetcode515. Find Largest Value in Each Tree Row在每个树行中找最大值
您需要在二叉树的每一行中找到最大的值。 示例: 输入: 1 / \ 3 2 / \ \ 5 3 9 输出: [1, 3, 9] class Solution { public: vector<int> largestValues(TreeNode* root) { vector<int> res; if(r...原创 2018-12-04 20:34:27 · 124 阅读 · 0 评论 -
Leetcode513. Find Bottom Left Tree Value找树左下角的值
给定一个二叉树,在树的最后一行找到最左边的值。 示例 1: 输入: 2 / \ 1 3 输出: 1 示例 2: 输入: 1 / \ 2 3 / / \ 4 5 6 / 7 输出: 7 注意: 您可以假设树(即给定的根节点)不为 NULL。 class Solution { public: int maxDepth; int res; in...原创 2018-12-04 20:32:49 · 154 阅读 · 0 评论 -
Leetcode138. Copy List with Random Pointer复制带随机指针的链表
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。 要求返回这个链表的深度拷贝。 方法一: class Solution { public: RandomListNode *copyRandomList(RandomListNode *head) { if(head == NULL) ...原创 2018-11-29 23:58:48 · 156 阅读 · 0 评论 -
Leetcode142. Linked List Cycle II环形链表2
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 说明:不允许修改给定的链表。 进阶: 你是否可以不用额外空间解决此题? 方法一:使用map 方法二: 分两个步骤,首先通过快慢指针的方法判断链表是否有环;如果有环,则寻找入环的第一个节点。具体的方法为,首先假定链表起点到入环的第一个节点A的长度为a,到快慢指针相遇的节点B的长度为(a + b)。...原创 2018-11-29 22:48:12 · 154 阅读 · 0 评论 -
Leetcode144. Binary Tree Preorder Traversal二叉树的前序遍历
给定一个二叉树,返回它的 前序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 递归: class Solution { public: vector<int> res; vector<int> preorderTraversal(...原创 2018-11-29 22:46:08 · 159 阅读 · 0 评论 -
Leetcode147. Insertion Sort List对链表进行插入排序
对链表进行插入排序。 从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。 每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。 插入排序算法: 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。 重复直到所有输入...原创 2018-11-29 22:42:17 · 126 阅读 · 0 评论 -
Leetcode150. Evaluate Reverse Polish Notation逆波兰表达式求值
根据逆波兰表示法,求表达式的值。 有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。 说明: 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。 示例 1: 输入: ["2", "1", "+", "3", "*"] 输出: 9 解释: ((2 + 1) * 3) = 9 示例 ...原创 2018-11-29 22:19:31 · 202 阅读 · 0 评论 -
Leetcode173. Binary Search Tree Iterator二叉搜索树迭代器
实现一个二叉搜索树迭代器。你将使用二叉搜索树的根节点初始化迭代器。 调用 next() 将返回二叉搜索树中的下一个最小的数。 注意: next() 和hasNext() 操作的时间复杂度是O(1),并使用 O(h) 内存,其中 h 是树的高度。 二叉树的中序遍历 class BSTIterator { public: stack<TreeNode*> s; ...原创 2018-12-01 21:11:26 · 154 阅读 · 0 评论 -
Leetcode199. Binary Tree Right Side View二叉树的右视图
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例: 输入: [1,2,3,null,5,null,4] 输出: [1, 3, 4] 解释: 先求深度,中序遍历或者前序遍历都可以 class Solution { public: vector<int> v; vector<int>...原创 2018-12-01 21:12:16 · 201 阅读 · 0 评论 -
Leetcode946. Validate Stack Sequences验证栈序列
给定 pushed 和 popped 两个序列,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。 示例 1: 输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1] 输出:true 解释:我们可以按以下顺序执行: push(1), push(2), push(3), push...原创 2018-12-17 16:41:46 · 334 阅读 · 0 评论 -
Leetcode 295. 数据流的中位数
中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。 例如, [2,3,4]的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两种操作的数据结构: void addNum(int num) - 从数据流中添加一个整数到数据结构中。 double findMedian() - 返回目前所有元素的中位数。 示例: add...原创 2019-03-21 19:29:25 · 275 阅读 · 0 评论 -
Leetcode284. Peeking Iterator顶端迭代器
给定一个迭代器类的接口,接口包含两个方法: next() 和 hasNext()。设计并实现一个支持 peek() 操作的顶端迭代器 -- 其本质就是把原本应由 next() 方法返回的元素 peek() 出来。 示例: 假设迭代器被初始化为列表 [1,2,3]。 调用 next() 返回 1,得到列表中的第一个元素。 现在调用 peek() 返回 2,下一个元素。在此之后调用 next() ...原创 2019-02-25 22:05:03 · 240 阅读 · 0 评论 -
Leetcode148. Sort List排序链表
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。 示例 1: 输入: 4->2->1->3 输出: 1->2->3->4 示例 2: 输入: -1->5->3->4->0 输出: -1->0->3->4->5 不推荐: class Solution { pub原创 2019-01-13 19:26:46 · 176 阅读 · 0 评论 -
Leetcode211. Add and Search Word - Data structure design 添加与搜索单词 - 数据结构设计
设计一个支持以下两种操作的数据结构: void addWord(word) bool search(word) search(word) 可以搜索文字或正则表达式字符串,字符串只包含字母 . 或 a-z 。 . 可以表示任何一个字母。 示例: addWord("bad") addWord("dad") addWord("mad") search("pad") -> false sea...原创 2019-01-17 17:25:59 · 246 阅读 · 0 评论 -
Leetcode208. Implement Trie (Prefix Tree)实现Trie(前缀树)
实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。 示例: Trie trie = new Trie(); trie.insert("apple"); trie.search("apple"); // 返回 true trie.search("app"); // 返回 false trie.startsWith("app"); // 返...原创 2019-01-17 17:25:12 · 208 阅读 · 0 评论 -
Leetcode143. Reorder List重排链表
给定一个单链表 L:L0→L1→…→Ln-1→Ln , 将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例 1: 给定链表 1->2->3->4, 重新排列为 1->4->2->3. 示例 2: 给定链表 1->2->3->4->5, 重新...原创 2019-01-12 11:01:28 · 212 阅读 · 0 评论 -
Leetcode92. Reverse Linked List II反转链表
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。 说明: 1 ≤ m ≤ n ≤ 链表长度。 示例: 输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL 把从m到n的反转, 然后再接上去。 class Solution { ...原创 2019-01-12 10:59:11 · 147 阅读 · 0 评论 -
Leetcode958. Check Completeness of a Binary Tree二叉树的完全验证性
给定一个二叉树,确定它是否是一个完全二叉树。 百度百科中对完全二叉树的定义如下: 若设二叉树的深度为 h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。(注:第 h 层可能包含 1~ 2h 个节点。) 示例 1: 输入:[1,2,3,4,5,6] 输出:true 解释:最后一层前的每一层都是满的(即...原创 2019-01-01 22:05:54 · 386 阅读 · 0 评论 -
Leetcode950. Reveal Cards In Increasing Order按递增顺序显示卡牌
牌组中的每张卡牌都对应有一个唯一的整数。你可以按你想要的顺序对这套卡片进行排序。 最初,这些卡牌在牌组里是正面朝下的(即,未显示状态)。 现在,重复执行以下步骤,直到显示所有卡牌为止: 从牌组顶部抽一张牌,显示它,然后将其从牌组中移出。 如果牌组中仍有牌,则将下一张处于牌组顶部的牌放在牌组的底部。 如果仍有未显示的牌,那么返回步骤 1。否则,停止行动。 返回能以递增顺序显示卡牌的牌组顺序...原创 2018-12-25 22:47:12 · 304 阅读 · 0 评论 -
Leetcode951. Flip Equivalent Binary Trees翻转等价二叉树
我们可以为二叉树 T 定义一个翻转操作,如下所示:选择任意节点,然后交换它的左子树和右子树。 只要经过一定次数的翻转操作后,能使 X 等于 Y,我们就称二叉树 X 翻转等价于二叉树 Y。 编写一个判断两个二叉树是否是翻转等价的函数。这些树由根节点 root1 和 root2 给出。 示例: 输入:root1 = [1,2,3,4,5,6,null,null,null,7,8], ro...原创 2018-12-31 20:38:31 · 226 阅读 · 0 评论 -
Leetcode938. Range Sum of BST二叉搜索树的范围和
给定二叉搜索树的根结点 root,返回 L 和 R(含)之间的所有结点的值的和。 二叉搜索树保证具有唯一的值。 示例 1: 输入:root = [10,5,15,3,7,null,18], L = 7, R = 15 输出:32 示例 2: 输入:root = [10,5,15,3,7,13,18,1,null,6], L = 6, R = 10 输出:23 提示: 树中...原创 2018-12-31 20:37:03 · 154 阅读 · 0 评论 -
Leetcode965. Univalued Binary Tree单值二叉树
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时,才返回 true;否则返回 false。 示例 1: 输入:[1,1,1,1,1,null,1] 输出:true 示例 2: 输入:[2,2,2,5,2] 输出:false 提示: 给定树的节点数范围是 [1, 100]。 每个节点的值都是整数,范围为 [0, 9...原创 2019-01-03 21:18:19 · 339 阅读 · 0 评论 -
Leetcode95. Unique Binary Search Trees II不同的二叉搜索树2
给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树。 示例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3] ] 重建树一般都是递归求解 class Solution { public: vector&l...原创 2018-12-11 19:44:44 · 171 阅读 · 0 评论 -
Leetcode109. Convert Sorted List to Binary Search Tree有序链表转换二叉搜索树
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 示例: 给定的有序链表: [-10, -3, 0, 5, 9], 一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5 ...原创 2018-11-26 20:58:15 · 134 阅读 · 0 评论 -
Leetcode106. Construct Binary Tree from Inorder and Postorder Traversal中序后续构造二叉树
根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 class Solution { public: TreeNode* buildTr...原创 2018-11-26 20:57:49 · 126 阅读 · 0 评论 -
Leetcode105. Construct Binary Tree from Preorder and Inorder Traversal前序与中序构造二叉树
根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 class Solution { public: TreeNode* buildTre...原创 2018-11-26 20:57:21 · 121 阅读 · 0 评论 -
链表分割
题目描述 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。 #include<bits/stdc++.h> using namespace std; struct ListNode { int ...原创 2018-09-28 23:37:33 · 183 阅读 · 0 评论 -
访问单个节点的删除
题目描述 实现一个算法,删除单向链表中间的某个结点,假定你只能访问该结点。 给定待删除的节点,请执行删除操作,若该节点为尾节点,返回false,否则返回true 解:把当前把下一个节点的值拷贝到当前节点,然后删除下一个节点。 /* struct ListNode { int val; struct ListNode *next; ListNod...原创 2018-09-28 23:34:32 · 220 阅读 · 0 评论 -
两个栈实现一个队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 解: 用两个栈来存储, 一个栈存储进队的元素 一个栈存储需要出队的元素 class Solution { public: void push(int node) { stack1.push(node); } int pop() { ...原创 2018-09-25 12:57:35 · 126 阅读 · 0 评论 -
合并两个排序的链表
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 注意考虑输入为NULL的情况 class Solution { public: ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { ListNode *last = NULL; ...原创 2018-09-25 13:21:50 · 119 阅读 · 0 评论 -
包含min函数的栈
题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 应用一个辅助栈。压入:如果A栈的压入比B栈顶部元素大,B栈不压。小于等于:AB栈同时压入。出栈:如果AB栈顶元素不等,A出,B不出。 class Solution { public: stack<int> s1; stack<int...原创 2018-09-25 13:27:11 · 235 阅读 · 0 评论 -
从上往下打印二叉树
题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印。 相当于BFS class Solution { public: vector<int> PrintFromTopToBottom(TreeNode* root) { vector<int> res; queue<TreeNode*> tree;...原创 2018-09-25 13:29:12 · 171 阅读 · 0 评论 -
已知前序或后续遍历和中序遍历重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 struct TreeNode { int val; TreeNode *left; TreeNode *...原创 2018-09-28 13:01:17 · 373 阅读 · 0 评论