![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
瓜不拉几程序控(LPG)
我有一个理想,属于自己的浮夸
展开
-
根据中序遍历和后续遍历(前序遍历)构造二叉树
根据中序遍历和后续遍历(前序遍历)构造二叉树首先说说递归:对于大部分人而言递归总是那么难,因为它的过程比较抽象和复杂,但是说到底递归也是分治法的思想只要我们求得相同子问题的解法那么对每个子问题求解并且合并就是我们整个递归的过程我们举个例子:假如一个树的前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]后序遍历 posto...原创 2019-04-11 16:53:36 · 3243 阅读 · 0 评论 -
二叉树的最近祖先
今天我们来讲讲二叉树的最近祖先,这是一个非常有趣的问题首先我们来看看一个例子来分析一下这个问题:这是一颗二叉树 那么寻找祖先分为几种情况呢?第一种:6 2或者6 7 6 4这种情况他们的公共祖先为5第二种2 4 5 4这种情况2 4的公共祖先为25 4的公共祖先为5所以我们将寻找公共祖先分为两部分:1.横向2.纵向思路:大概的办法有了接下来我们说说具体的横向:...原创 2019-04-19 18:59:31 · 399 阅读 · 0 评论 -
二叉树的序列化与反序列化
今天给大家讲一下二叉树的序列化与反序列所谓序列化就是把二叉树变为一个易于存储的string 反序列化就是把string变为二叉树这里我们利用前序遍历来序列化二叉树与反序列化二叉树利用前序遍历把二叉树变为字符串例如此二叉树1.序列化我们把null用#代替用StringBuffer来存储结果结果为序列化后[1,2,#,#,3,4,#,#,5,#,#]我们把1,2,#,#,3,4,#,...原创 2019-04-19 19:37:31 · 452 阅读 · 0 评论 -
链表部分开始 判断单链表是否有环
链表是一种常用的的数据结构今天我们来讲讲一个链表如何判断它有环其实思路就类似于龟兔赛跑围绕一个田径场 快的始终会与慢的相遇我们创建两个指针一个叫fast一个叫slow 让fast一次移二步 slow一次移一步 当fast第一次=slow是说明有环返回true否则当fast=null或者fast.next=null时返回false思路比较简单上代码:public class Solution...原创 2019-04-20 11:37:01 · 125 阅读 · 0 评论 -
二叉搜索树迭代器
二叉搜索树迭代器什么是二叉搜索树迭代器调用 next() 将返回二叉搜索树中的下一个最小的数。如图:这里我们next和hasNext()的操作的时间复杂度为O(1)我解决这个问题的思路:1.我们首先让所有的左孩子全部入栈如图:7,32.然后我们在next方法里开始弹栈如果该节点有右子树那么我们假设temp=node.right然后让temp和temp的左子树全部入栈最后返回...原创 2019-05-08 10:47:13 · 178 阅读 · 0 评论 -
二叉搜索树开始部分——验证二叉搜索树(附带介绍)
二叉搜索树开始部分——验证二叉搜索树(附带介绍)1.什么是二叉搜索树1.二叉搜索树是一种二叉树的特殊形式2.二叉搜索树根据插入节点值的大小决定节点向右子树移动还是向左子树移动每个节点中的值必须大于(或等于)存储在其左侧子树中的任何值。每个节点中的值必须小于(或等于)存储在其右子树中的任何值。3.二叉搜索树节点的值一定是可比的4.二叉搜索树中不存在重复值(可以用它来实现map和set)...原创 2019-05-05 18:33:21 · 101 阅读 · 0 评论 -
链表结束——单链表的插入和删除
链表结束——单链表的插入和删除链表的插入:1.我们把链表的插入分为三种情况头插,尾插和中间插2.我们定义两个指针head和rear3.刚开始当链表的size=0时我们head=rear指向一个无意义的节点作为表头4.插入时我们按照索引进行插入:分为三种情况:1.当index=0时我们进行头插头插时我们的逻辑很简单我们让要插入的节点node.next=head.next,head.n...原创 2019-04-30 15:49:36 · 321 阅读 · 0 评论 -
二叉搜索树————插入节点
二叉搜索树————插入节点插入节点那么我们该如何插入呢思路:递归深度当我们要插入的节点值小于根节点时我们让它向根的左子树移动反之向右子树移动如果相等我们更新相应节点的值或者不管都可以比如图一:插入5节点5大于四小于7所以5去7的左子树上代码:class Solution { public TreeNode insertIntoBST(TreeNode root, int v...原创 2019-05-10 08:04:34 · 248 阅读 · 0 评论 -
二叉搜索树———二叉搜索树的删除操作
二叉搜索树———二叉搜索树的删除操作我们把二叉搜索树的删除分为三种情况第一种:没有孩子节点直接删除如图删除 7,4,2直接删除接可以第二种:只有一个孩子节点把孩子节点拉上去即可如图:删除6把7拉上去第三种:两个节点都不为空这个时候我们需要找到其右子树的最小节点返回并且要删除最小节点并且把其右子树返回给它如图:删除3 4没有左孩子直接返回4 所以最后的结果只是4覆盖3在代码里我们将...原创 2019-05-10 08:27:44 · 943 阅读 · 0 评论 -
字符串解码
字符串解码我们来讲讲思路:一看到括号的匹配问题我们就要想到一个数据结构:栈,那么我们这个题的解决的基本方向就是利用栈先入后出的特点,那么:1.我们先遍历字符串2.如果当前字符为‘]’那么我们开始出栈...原创 2019-07-31 11:04:34 · 338 阅读 · 0 评论 -
01矩阵
01矩阵一个充满着坑的dp问题,今天我们用dfs来解决这个问题1.首先遍历数组当1的左上右下四个方向没有0时我们给它初始化一个较大的值数组的行数加列数这样做是为了保证在我们寻路时确保此位通过+1不能遇见02.我们开始遍历这个二维数组当matrix[i][j]==1时开始递归逻辑3.我们定义一个direction数组这个数组定义左上右下四个方向的移动坐标4.在递归函数里开始循环direct...原创 2019-07-31 11:52:26 · 1665 阅读 · 0 评论 -
反转链表
反转链表今天给大家讲一下反转链表如图这样的效果我们有两种方法来解决这个问题第一种:递归:1.我们让head.next.next=head;head.next=null;2.第一次2->13.第二次3->2->1…以此类推逻辑比较简单上代码:class Solution { public ListNode reverseList(ListNode ...原创 2019-04-24 11:35:33 · 111 阅读 · 0 评论 -
回文链表
回文链表今天给大家讲一下判断回文链表如图:思路:1.我们先求链表的中点使用双指针一个为fast=head.next一个为slow=head,fast=fast.next.next,slow=slow.next当fast走到尾时slow走到中点2.找到中点后我们反转链表的后半部分反转(中点.next)3.我们将返回值给中点的next4.我们让p1=中点,p2=中点.next迭代当p1...原创 2019-04-28 16:58:25 · 95 阅读 · 0 评论 -
图的邻接表ATP以及遍历(非递归深度和广度遍历)
import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.Queue;import java.util.Stack;class Edge{//边 Object verAdj;//该弧指向的节点名 int weight;//权重 Edge nextEd...原创 2018-11-12 18:49:40 · 219 阅读 · 0 评论 -
JAVA图的邻接矩阵表示法ATP以及操作的实现(包括深度优先搜索和广度优先遍历)
//邻接矩阵存储import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.Queue;public class GraphExample { private List<Object> vertexList;//存储点的表 private int...原创 2018-11-09 13:41:44 · 412 阅读 · 0 评论 -
判断链表的入环节点
判断链表的入环节点昨天我们讲了怎么判断链表有环https://blog.csdn.net/qq_40163148/article/details/89415068今天我们将如何判断链表的入环节点当我们一个链表有环时我们有两种方法判断链表的入环节点如图:第一种方法(前提当链表有环时)1.我们把slow=fast的节点返回显然-4的节点返回2.然后我们让fast变为一次走一步同时让...原创 2019-04-21 11:02:03 · 401 阅读 · 0 评论 -
求二叉树的深度
求二叉树的深度今天我们来了解一下如何求二叉树的深度方法一:自上而下所谓自上而下的方法顾名思义就是从根节点出发每向下一层深度加一到叶子节点更新最大深度直至递归完毕最后取左右子树其中的的最大深度自下而上从叶子节点开始没向上一层深度加一然后取左右最大的深度采用动态规划的思想道理比较简单看代码自己意会leetcode里有动画懒得画图可以去看看 探索-二叉树https://leetcod...原创 2019-04-16 22:50:09 · 145 阅读 · 0 评论 -
移除链表元素(删除所有val的节点)
移除链表元素(删除所有val的节点)如图我们要删除值为val的所有元素我的思路:1.出于空间复杂度的考虑我们这只实例化一个节点node用来当作删除后链表的头节点2.我们用node1=node记录头节点3.当head!=null时我们判断head.val==vall如果是true 则使node.next=head.next4.否则(else)我们使node.next=head,node...原创 2019-04-25 19:06:24 · 629 阅读 · 0 评论 -
求二叉树的路径满足某个sum值
今天我们将如何求二叉树的一个路径和满足某个sum这里讲一下原理我们需要记录当前的路径和和sum作比较然后记录所有的路径和sum相比后返回的布尔值只有一个true就是满足的路径采用的方法:递归道理很简单代码里面解释逻辑class Solution { public boolean hasPathSum(TreeNode root, int sum) { if(root...原创 2019-04-17 18:31:16 · 251 阅读 · 0 评论 -
相交链表
今天给大家讲一下相链表及判断相交开始的节点首先我们里说说思路如图: 一个指针指向a的表头a1一个指针指向b的表头我们设指向a的为pointA 指向b的为pointB1.我们让pointA和pointB一起走只要啊pointA!=pointB就一直走2.当a走到头时我们改变让pointA指向b的表头同样当b走到头时让pointB指向a的表头3.让pointA和pointB互换走时如果相交...原创 2019-04-22 16:22:53 · 83 阅读 · 0 评论 -
二叉树的层次遍历(按层封装)
二叉树的层次遍历(按层封装)最近在数据结构的道路上前进,上周完成了二叉树模块的基本练习,今天和大家分享一下二叉树的层次遍历(按层封装)的思路和想法并且以后会持续更新数据结构模块的内容,好了言归正传:二叉树的遍历分为四种前,中,后和层次遍历以上遍历逐个讲解今天我们讲解 二叉树的层次遍历(按层封装)比如就这样一颗二叉树:很容易理解层测遍历的结果为3 9 20 15 17作为一个树结构...原创 2019-04-15 15:44:26 · 3485 阅读 · 0 评论 -
删除链表倒数第n个节点
删除链表倒数第n个节点第一种方法:双指针我们来讲一下双指针解决这个问题思路:1.假如我们要删除倒数第二个节点2.我们设置两个指针node1=head和node2=head,设要删除倒数第n个节点;3.我们先让node1移动n次 如图指向34.我们以node1为准当node1!=null并且node1.next!=null时node1=node1.next,node2=node2.n...原创 2019-04-23 19:28:05 · 126 阅读 · 0 评论 -
奇偶链表
奇偶链表今天给大家讲一下奇偶链表所谓奇偶链表就是把链表的奇数节点与偶数节点分开并把奇数节点排在偶数节点之前形成新的链表如图:我的思路:1.首先我们要来两个指针ji=head和ou=head.next并且ou1=ou2.我们当ou!=null&&ou.next!=null时让ji.next=ji.next.next,ou.next=ou.next.next3.移动ji和...原创 2019-04-28 16:07:21 · 171 阅读 · 0 评论 -
钥匙和房间
1. 这是一个很经典的递归问题,首先递归终止条件就是有没有访问过所有房间有返回true,如果房间已经被访问过返回一个值就是所有房间有没有被访问过都访问过返回true否则返回false2.将当前房间的访问位置true3.遍历此房间的钥匙列表,开始递归如果返回true则返回true跳出,否则循环完毕后返回false无法访问全部的房间class Solution { publi...原创 2019-07-31 12:18:04 · 351 阅读 · 0 评论