![](https://img-blog.csdnimg.cn/20190927151043371.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构类题目
数据结构
八卡卡
这个作者很懒,什么都没留下…
展开
-
Stack && Queue - 044 -反转单词的顺序
题目牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?思路利用栈先进后出的顺序实...原创 2020-04-08 17:42:12 · 119 阅读 · 0 评论 -
Stack && Queue -020 -栈的压入、弹出序列
题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路new 一个栈 把 压入顺序的数组存入栈中同时循环判断 看当前栈顶元素是否与弹出数...原创 2020-04-08 16:13:06 · 130 阅读 · 0 评论 -
Stack && Queue-020-包含min函数的栈
题目定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。思路题目理解:实现这几个函数,top是栈顶元素用辅助栈stackMin 来存储最小值最小值一直放在栈顶所以遇到更小的存入栈顶 遇到大的 复制栈顶元素 成为新的栈顶这样才能保证pop的时候不会...原创 2020-04-08 15:50:01 · 87 阅读 · 0 评论 -
Stack && Queue-005-用两个栈实现队列
题目用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路存入的时候直接存入stack1取出的时候 弹出stack2的栈顶元素如果stack2为空把stack1 中的所有存入stack2再弹出...原创 2020-04-08 15:12:55 · 60 阅读 · 0 评论 -
Tree -62-二叉搜索树的第K个节点
题目给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。思路中序遍历得到排序好的list返回list.get(k-1)注意特判代码import java.util.ArrayList;public class Solution { TreeNode KthNode(TreeNode pRoot...原创 2020-04-08 14:45:48 · 69 阅读 · 0 评论 -
Tree-61-序列化二叉树
题目请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到的序...原创 2020-04-08 14:28:48 · 87 阅读 · 0 评论 -
Tree-60-把二叉树打印成多行
题目从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路上一题精简版,ArrayList<ArrayList >已经体现了按层次打印代码import java.util.*;public class Solution { ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) ...原创 2020-04-08 13:08:23 · 78 阅读 · 0 评论 -
Tree-059-之字形打印二叉树
题目请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路和层次打印一样 存入队列 取出到list里不同的是需要判断奇数行还是偶数行给一个变量odd = true一次循环结束时 将变量转换odd = !odd倒叙打印用 add(index,node)将数据插入index 之后依次向后移...原创 2020-04-08 12:52:41 · 70 阅读 · 0 评论 -
Tree - 058 -对称的二叉树
题目请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路写一个函数判断左右子树是否对称代码public class Solution { boolean isSymmetrical(TreeNode pRoot) { if(pRoot == null) return tr...原创 2020-04-07 19:29:47 · 93 阅读 · 0 评论 -
Tree - 057 - 二叉树的下一个结点
题目给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路先找到根节点 然后中序遍历存到list中 找到下一个结点代码import java.util.ArrayList;public class Solution { static ArrayList<TreeLinkNode> ...原创 2020-04-07 19:08:25 · 136 阅读 · 0 评论 -
Tree - 039 -平衡二叉树
题目输入一棵二叉树,判断该二叉树是否是平衡二叉树。思路比较左右路径长度不满足相差小于等于1 则返回-1 即不是满足的话返回两者间的最长路径 继续递归代码public class Solution { public boolean IsBalanced_Solution(TreeNode root) { if(root == null) return true;...原创 2020-04-07 11:46:56 · 75 阅读 · 0 评论 -
Tree038 - 二叉树的深度
题目输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路关键是左右分开计数代码 public int TreeDepth(TreeNode root) { //此题的关键是左右分开计数 如果遇到叶节点之后为0 不计数 if(root == null) return 0; ...原创 2020-04-07 11:21:58 · 87 阅读 · 0 评论 -
Tree026-二叉搜索树与双向链表
题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路中序遍历二叉树得到排序好的链表再调整指针代码import java.util.ArrayList;public class Solution { public TreeNode Convert(TreeNode pRootOfTree) { ...原创 2020-04-07 11:07:15 · 74 阅读 · 0 评论 -
Tree-024-二叉树中和为某一值的路径
题目输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)思路把每次遍历的根节点存入list中target -= root.val如果找到,即target == 0且左右子树为空 即终止于叶节点 把路径存入result因为递归的思想一直递...原创 2020-04-02 10:39:36 · 88 阅读 · 0 评论 -
Tree-022-从上往下打印二叉树
题目从上往下打印出二叉树的每个节点,同层节点从左至右打印。即对二叉树进行层次遍历思路把二叉树的节点存入队列如果不为空 则把值存入Arraylist访问后删除队列中的元素 同时保存给tmp如果tmp的左孩子不为空 存入队列如果又孩子不为空 存入队列代码import java.util.*;public class Solution { public ArrayList&...原创 2020-04-02 08:02:09 · 80 阅读 · 0 评论 -
Tree - 023-二叉搜索树的后序遍历
题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路一棵 BST :左孩子 < 根结点 < 右孩子一棵 BST 的左子树或者右子树都是 BST后序遍历是,左右根:[3, 4, 9, 5, 12, 11, 10],结合图再从左往右分析后序序列,分析子树,可以发现:树区间的最后一个数...原创 2020-04-02 08:44:59 · 85 阅读 · 0 评论 -
Tree-018-二叉树的镜像
题目操作给定的二叉树,将其变换为源二叉树的镜像。思路调换左右节点 递归调用代码public class Solution { public void Mirror(TreeNode root) { if(root == null ){ return ; } TreeNode tmp = root.left;...原创 2020-03-30 16:17:36 · 161 阅读 · 0 评论 -
Tree-017-树的子结构
题目输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)基础知识子树的意思是包含了一个节点,就得包含这个节点下的所有节点,一棵大小为n的二叉树有n个子树,就是分别以每个节点为根的子树。子结构的意思是包含了一个节点,可以只取左孩子和右孩子 而不是左子树右子树例子:建树是层次遍历根据测试用例来看 应该是必须有左右孩子 不能只匹配到一个思路主函...原创 2020-03-29 17:26:29 · 82 阅读 · 0 评论 -
LinkedList-56-删除链表中重复的节点
题目在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路为了避免出现头结点也重复 导致删除头结点的现象在头节点之前设置一个辅助节点...原创 2020-03-29 16:47:59 · 94 阅读 · 0 评论 -
Tree-004-重建二叉树
题目输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路分析根据中序遍历和前序遍历可以确定二叉树,具体过程为:根据前序序列第一个结点确定根结点根据根结点在中序序列中的位置分割出左右两个子序列对左子树...原创 2020-03-29 16:40:48 · 93 阅读 · 0 评论 -
Linkedlist-025-复杂链表的复制
题目输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路代码public class Solution { public RandomListNode Clone(RandomListNode pHead) ...原创 2020-03-24 17:58:01 · 343 阅读 · 0 评论 -
LinkedList-055-链表中环的入口结点
题目给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路首先 有环的链表长这样如果存在环 那么因为fast 和slow 速度不一样 他们总会相遇fast 和slow 在Z1相遇那么 fast 走过的路长度 = x+ny+(n-1)zslow 走过的长度 = x+y因为fast 是每次移动两个节点 所以 2(x+y) = x+ny+(n-1)z但我们需要...原创 2020-03-24 16:51:16 · 111 阅读 · 0 评论 -
LinkedList-036-两个链表的第一个公共节点
题目输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)思路首先明确什么是公共节点公共节点指的是两个链表从某一节点开始 next都指向同一节点比如0-1-2-3-4-5-nulla-b-4-5-null4就是他们的第一个公共节点首先想到的方法是存入map但有一种更简便的方法list1 指针p1 li...原创 2020-03-24 16:00:18 · 720 阅读 · 0 评论 -
LinkedList-016-合并两个或k个有序链表
题目输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路new一个新链表 指向该链表的指针cur当两个链表都不为空时如果list1.val<=list2.val那么cur.next指向list1list1向右移否则list2进行操作之后cur向右移如果其中一个链表在循环结束后为空那么cur连接到另一个链表代码public ...原创 2020-03-24 14:45:55 · 169 阅读 · 0 评论 -
LinkedList-015-反转链表
题目输入一个链表,反转链表后,输出新链表的表头。思路反转之后 第一个节点指向空第二个节点指向第一个节点设置两个指针next用于记录当前节点的下一个结点pre用于记录前一个节点初始化时为空所以第一个节点指向空返回pre最后一轮时 最后一个节点指向pre 然后pre 继续向后移所以pre是反转之后的第一个节点代码public class Solution { pub...原创 2020-03-24 14:15:33 · 158 阅读 · 0 评论 -
LinkedList-014-链表中倒数第k个节点
题目输入一个链表,输出该链表中倒数第k个结点。思路快慢指针当快指针指到i=k时慢指针开始移动慢指针指向倒数第k 个用了一个原理 即整数第k个 是倒数第k-1个由于i是从0开始所以 i=k时 实际上是整数第k+1个另一方面 如果i<k则快指针指向空时 慢指针还没有开始移动一直指向头结点 输出慢指针时 输出的时整个链表所以返回的时候需要做一个判断如果i<k 那么...原创 2020-03-24 10:04:08 · 97 阅读 · 0 评论 -
LinkedList -003-从尾到头打印链表
题目输入一个链表,按链表从尾到头的顺序返回一个ArrayList。思路读取链表是从头到尾 而打印是从尾到头可以用Arraylist 的add 方法add(index,val)是在指定位置添加 然后其他数据后移代码import java.util.ArrayList;public class Solution { public ArrayList<Integer>...原创 2020-03-24 09:42:43 · 171 阅读 · 0 评论