首先看最重要的一个东西:
Leetcode剑指27.二叉树镜像
请完成一个函数,输入一个二叉树,该函数输出它的镜像。
做递归思考三步:
递归的函数要干什么?
函数的作用是判断传入的两个树是否镜像。
输入:TreeNode left, TreeNode right
输出:是:true,不是:false
递归停止的条件是什么?
左节点和右节点都为空 -> 倒底了都长得一样 ->true
左节点为空的时候右节点不为空,或反之 -> 长得不一样-> false
左右节点值不相等 -> 长得不一样 -> false
从某层到下一层的关系是什么?
要想两棵树镜像,那么一棵树左边的左边要和二棵树右边的右边镜像,一棵树左边的右边要和二棵树右边的左边镜像
调用递归函数传入左左和右右
调用递归函数传入左右和右左
只有左左和右右镜像且左右和右左镜像的时候,我们才能说这两棵树是镜像的
调用递归函数,我们想知道它的左右孩子是否镜像,传入的值是root的左孩子和右孩子。这之前记得判个root==null。
刻烟吸肺坚决不忘递归三部曲:::::
- 在递归函数内需要做什么?
- 递归终止的条件是什么?
- 递归函数要传给下一层的东西是什么?
本人的一个好办法就是,在做题时,如果想到是递归,就先把这三句话写出来,顺着这三个目标去做,很快就可以理清思路。
递归的一个关键:只思考一层内的事情,千万不要被绕进去,一旦绕进去,几乎就出不来了。
递归就是多练,多写,这种东西,就得靠脊柱做题。
还有就是dp了,dp也是一个道理,多练多写,现在接触的不够多,所以看到题目总是很茫然。说实话,刷题就是量变引起质变的一个过程。从10分钟内ac简单题开始,慢慢的进步。
同样的,dp也有对应的解题技巧,dp最关键的就是状态转移方程,一般把状态转移方程写出来基本就能解出来。
目前接触的题目来看,我认为状态转移方程入手的角度:可以从终止态入手,往前推,个人感觉一般比从前往后推要容易。同时,可以画出状态转移表。
比方说最简单的跳楼梯这个问题,从前往后推会很让人痛苦。但如果从后往前推。
最后一跳只可能是倒数第二层或倒数第一层,这样的话最优解就是这两跳中的某一跳。那就是Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]) 也就可以得出状态转移方程dp[i]。这样来看的话,是不是很容易呢。
但是可能这种思想也并不完全正确,因为本人还是小白,只是提出了一些自己在从小白成长的路上遇到的认为有价值的方法。也许若干年后回头再看这些,只会觉得羞涩不堪。
刷题是快乐的
曾经和我一起创业的朋友曾经说我现在刷题就是找死,最后什么工作也找不到,我不信这个邪,刷题真的很快乐。如果人生是为了学到更多的知识,而不是为了其他什么东西,那刷题真的是非常有意思的事情。
今天还复习了之前做的二分的题目,虽然现在都能在10分钟内ac,但是总觉得自己其实理解的还不够透彻。等做的题目再多一些的时候,可以做一个总结。 话说,现在做二分就有一种脊柱做题的感觉,很爽,感觉看到绿色通过时,呼吸都会顺畅很多。
二叉树真的很差
很多基础的数据结构,学的其实很不扎实,比方说二叉树和图。老老实实去看算法4吧!明天书就到了,继续看老头讲课了。
对了,定了个不切实际的目标:7月前刷满800道题 400道简单,300道中等,100道困难。