- 博客(18)
- 收藏
- 关注
原创 算法通关村——二叉树里的双指针
将两个树的每个结点合并,如果两个结点不为空就相加为新的结点值,如果又一个为空,另一个结点就成为新的结点,如果都为空,则合并的也为空节点。LeetCode100:给定一个函数来判断两颗树是否相同,如果两棵树的结构相同并且相同结点的值一样,则说明两棵树相同。我们可以把一颗数的两个孩子当成子树的两个根节点,这样该问题就可以变成判断两个数是否对称,和上面的题目就很相似了。和上题不同的是,相同是看同侧,对称是看异侧,分为里侧和外侧。外侧就是判断左节点的左孩子是否等于右节点的右孩子,①当两个结点的值为空时,则相等。
2023-10-14 14:19:10
395
1
原创 算法通关村——迭代实现二叉树的前序
由于递归类似于栈,一层一层遍历到深处,在触底反弹。所以我们用迭代的时候要用到栈来复刻一下递归实现。递归中如果要调用方法的话,那在迭代里就类比入栈。因为递归要触底反弹,一层一层扒皮,迭代里我们就要设置的极限,然后出栈。递归看起来特别简洁,但是一般情况下,递归都是可以用迭代来转换的。由于迭代相对复杂一点,这里我们就用迭代来实现一下。这个是前序遍历,如果想后序和中序的话,只需要将res.add(root.val)换个位置即可完成。平时我们完成二叉树的遍历可能会用到递归。
2023-09-23 10:33:21
547
1
原创 算法通关村——二叉树层次遍历原来如此简单
这里我们可以用队列来完美解决,队列FIFO,层次遍历同样如此,刚好可以将下一层的结点保存到该层的后面,出队的时候也是该层的结点先出来,其次是下层结点出来。如,查找二叉树每层的最大结点值LeetCode515,最小结点值,每层的平均结点值LeetCode637,二叉树的右视图LeetCode199.但是我们是要找的最左边的,所以我们也可以反转一下,每层都反转一下,这样遍历的最后一个元素就是我们所要找的结点值了。我们可以发现,如果我们找最底层最右侧的元素,向我们普通的层次遍历,最后一个一定是所求元素。
2023-09-19 23:44:33
846
原创 算法通关村——如何使用中序和后序来恢复一颗二叉树
我们知道了一颗树的中序和前序,或者中序和后序就可以来恢复二叉树了。但是我们如果只知道前序和后序就无法来恢复。但是如果我们只知道前序和后序,就无法知道根节点的左右结点是哪些。因为我们可以通过前序或者后序,可以判断一个树的根节点。通过中序我们可以知道这个根节点的左右子树有哪些结点。现在我们演示一下,用中序和后序如何恢复一颗二叉树。
2023-09-18 22:28:16
597
原创 算法通关村——栈与队列相互实现问题
我们要在出栈的时候,且outstack里是空的时候,将instack里的outstack里。由于栈是后进先出,所以当我们用队列先进先出实现时候,我们设置两个队列,一个负责保存入队元素之前的元素集放入队头q1,另一个队负责将该入队元素到队尾q2,这样刚入队的元素就可以最先出队,实现后进先出。我们也就可以设置两个堆栈,一个赋值进栈的instack,一个负责出栈的outstack,我们将instack弹出outstack,然后outstack出栈就是想要的结果了。那么最后这个数字就是最先出来的,也是最先进来的。
2023-09-17 15:23:37
559
1
原创 算法通关村——队列和哈希表基础
如图,存7的时候模为0,放入0的位置。存8的时候,模为1,但是1的位置已有了,就往后寻找,找到第一个为null的地方也就是3的位置,此时8就存到3的位置。存9的时候,模为2,但是2也有位置了,就往后寻找,找到6的位置,就存入6的地方。如果我们要查找13在不在hash里,我们通过公式就得index=13%7=6,我们可以就去访问所以为6的位置,发现有13,我们就找到了,返回true。上图,我们可以看到有的位置上要存两个或以上的元素,单纯的数组是不行的,像这种,求的index值,该值就可以作为所谓的。
2023-09-16 11:25:03
668
1
原创 算法通关村——逆波兰表达式问题
想想栈呢,栈的特性后进先出,我们将每个数字压入栈中,由于找到符号后,就将前两个数字计算,这样我们弹出两个数字,刚好是前两个数字,计算后再放入栈中,刚好又保存了新的数字,直到没有找到符号,我们的表达式也就算完了,最后栈里的数字就是想要的结果。如果用数组,我们找到符号后,前面两个数计算后的结果,保存在哪里呢,就算保存了,我们万一后面又出现数字,那么还要保存前面数组最后的数字位置,这样会很麻烦,所以数组pass。在数据结构里,这可以看成是一个二叉树,如下图,每个结点可能是个计算符,也可能是个数字。
2023-09-14 21:46:07
705
1
原创 算法通关村——最大栈/最小栈问题解析
我们先将Max栈顶元素max保存,然后和实际值栈顶元素比较,如果不同,就弹栈,然后比较下一个栈顶元素,直到找到该元素。弹栈的时候,Max栈和实际值栈都要同时弹栈,如果Max栈中不弹栈的话,在最大元素之后的所有元素都是这个max值,然而这个max值已经不在了,所以要弹栈后,重新入栈,做到实时更新。那么我们现在搞点不同的,我们多设置一个方法popMax( ),这个方法检索出栈中最大元素,并让其出栈,如果有多个一样的元素,则出栈最近的一个。当-3入栈后,由于-3是实际值中最小的,所以Min栈中放入-3。
2023-09-10 19:54:01
766
1
原创 算法通关村——基于数组实现栈
如果是第一种,入栈push就要先加后存stack[++top]=elem,出栈pop就要先取后减stack[top--]=elem。一般top有两种指向,有的地方是指向栈顶元素,有的是指向栈顶元素的上一个空区域,不同的指向插入和删除的方法也有一些不同。初始时候如果top=-1 就是指向栈顶元素,如果top=0,就是指向栈顶元素的上一个单元。自己手动实现栈,可以用链表和数组实现栈,这里我们就用数组实现,但是数组实现栈要记得扩容。栈的插入和删除操作只允许在栈顶(top)实现,不可操作的一端叫做栈底。
2023-09-10 11:27:15
660
1
原创 算法通关村——双指针的作用
但是这里要注意,由于没有判断a[fast]的值,所以可能a[fast]=val,所以不要一边覆盖一边移动slow,有可能会放过换过来的val。所以如果 a[fast]!=val ,那么就将fast位置的元素存入到slow中,a[slow]=a[fast],slow和fast都+1。由于重复元素要保存一个,所以当遇到重复元素时,fast走到重复元素的最后一位时,fast肯定会与下一位不同,恰好保存一个到slow位置上。如果相等的话,就fast++,否则就将该元素保存到slow的位置上,并且slow++
2023-09-04 22:05:52
643
1
原创 算法通关村——不简单的数组增删改查
我们可以逆向思维,从数组后面判断,我们将数组a[ ]的大小size更新为a.size+b.size,这样肯定可以把所有元素都存入到a中,而且在我们为更新原数组时 也不会干扰原数组a[ ]中的元素。将数组a[ ]和b[ ]的元素都放入到数组a[ ]中,但是怎么放呢,如果从头放,那么当数组b[i]大于a[i]时,就会将数组a[ ]后移,如此反复,会浪费很多时间。删除元素时,我们首先要判断序列中是否有该元素,如果没有的话,则无法进行删除,有的话,就找到该元素位置,然后将该元素后面的元素前移,来覆盖前一个元素。
2023-09-03 21:47:29
618
原创 算法通关村第二关——指定区间反转和两两交换反转问题解析
直接头结点连到第二个结点 demmy->next=node2,第一个结点连到第二个结点的后继node1->next=node2-->next,第二个结点连第一个结点node2->next=node1。再观察上图可发现,每有一个新结点插入时,node(2)总是在这串反转链表的最后一个,所以node(2)可以一直连在链表中,有个妙招就是让node(2)连在一下要反转的结点的下一个结点,也就是node(2)=node(2)->next->next;
2023-09-01 23:42:34
822
1
原创 算法通关村第一关 | 黄金挑战 | 链表中环的问题
给定一个链表,判断该链表是否有环,如果有,请判断环的入口位置如上图,就是一个有环的链表,环入口位置为Node(2),那么类似的题该如何解决呢。
2023-08-31 14:34:45
861
原创 编程导航算法通关村第一关|白银 | 回文与公共结点问题
而当奇数个结点时,slow指向的是中间的结点,为了统一处理,这里要做个判断,判断节点个数为奇数时(也就是fast->next==NULL时),slow要再移1位。再换个思路,可以先将两个链表拼接起来,上图可以看到,无论是A连B还是B连A,他们最后的三个结点都是一样的,都是6,7,8,所以只要找到最后一样的结点即可。如图,链表a长度为6,链表b长度为4,求出两者差值,使链表a的头指针前移2次,这样a和b的头指针就会从同一起跑线开始遍历后面的链表,方便找到相同的结点。可以将整个链表反转,反转后和原链表比较。
2023-08-29 23:07:59
977
1
原创 编程导航算法通关村第一关|青铜教程 | 链表插入
②然后要确定插入的位置,找到需要插入的结点的前驱结点,可以通过判断前驱结点的后继结点是否为要插入的值来找到要插入的位置。先让新节点指向要插入的结点,newNode->next=node(15)->next,再让新节点与前驱结点连接,node(15)->next=newNode。注意先后指针指向顺序不能颠倒,因为链表中能够一个结点只有一个后继结点,如果先node(15)->next=newNode,就不能找到要插入的结点,也就不能连接上该结点了。综上,单链表插入插入的方法如下。
2023-08-27 14:20:17
1134
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅