对称的二叉树
思路:用递归,首先明白递归中止的条件是什么
搬用别人的看法:
做递归思考三步:
1.递归的函数要干什么?
函数的作用是判断传入的两个树是否镜像。
输入:TreeNode left, TreeNode right
输出:是:true,不是:false
2.递归停止的条件是什么?
左节点和右节点都为空 -> 倒底了都长得一样 ->true
左节点为空的时候右节点不为空,或反之 -> 长得不一样-> false
左右节点值不相等 -> 长得不一样 -> false
3.从某层到下一层的关系是什么?
要想两棵树镜像,那么一棵树左边的左边要和二棵树右边的右边镜像,一棵树左边的右边要和二棵树右边的左边镜像
调用递归函数传入左左和右右
调用递归函数传入左右和右左
只有左左和右右镜像且左右和右左镜像的时候,我们才能说这两棵树是镜像的
调用递归函数,我们想知道它的左右孩子是否镜像,传入的值是root的左孩子和右孩子。这之前记得判个root==null。
代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root==null) {
return true;
}
return compare(root.left,root.right);
}
public boolean compare(TreeNode left,TreeNode right) {
if(left==null&&right==null) {
return true;
}
if(left!=null&&right==null) {
return false;
}
if(left==null&&right!=null) {
return false;
}
return (left.val==right.val)&&compare(left.right,right.left)&&compare(left.left,right.right);//左左镜像和右右镜像且左右镜像和右左镜像值也相等的时候才是镜像的
}
}
青蛙跳台阶问题–简单动态规划
思路:通过找规律可以发现,当n=0,输出为1;n=1,输出为1;n=2,输出为2;n=3,输出为3;n=4,输出为5,类似于斐波那契(Fibonacci)数列
有一个小知识点:
class Solution {
public int numWays(int n) {
int[] arr=new int[200];
arr[0]=1;
arr[1]=1;
for(int i=2;i<=n;i++) {
arr[i]=(arr[i-1]+arr[i-2])%1000000007;//找规律
}
return arr[n];
}
}