递归思考三步:
-
递归函数要干什么?
判断两个树是否为镜像
-
递归的停止条件时什么?
当有一个节点为null时递归停止,或判断到一半确定有节点不一样即非对称树
若前边所有判断都为true 到最后左右节点都为空 则true
当两节点的值不相等 false;
-
从某层到下一层的关系是什么?
要想两棵树镜像,那么一棵树左边的左边要和二棵树右边的右边镜像,一棵树左边的右边要和二棵树右边的左边镜像,下一层左左是否等于右右,左右是否等于右左。
class Solution {
public boolean isSymmetric(TreeNode root) {
return root == null ? true : recur(root.left, root.right);
}
boolean recur(TreeNode L, TreeNode R) {
if(L == null && R == null) return true;
if(L == null || R == null || L.val != R.val) return false;
return recur(L.left, R.right) && recur(L.right, R.left);
}
}
例题:剑指offer.34 二叉树到叶子结点的路径
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。(叶子节点 是指没有子节点的节点)
class Solution {
List<List<Integer>> list = new LinkedList<List<Integer>>();//存放最终输出结果
LinkedList<Integer> res = new LinkedList<>();//存放路径
public List<List<Integer>> pathSum(TreeNode root, int target) {
//从根节点开始dfs 如何保存路径?
dfs(root,target);
return list;
}
//确定递归参数
private void dfs(TreeNode root,int target){
//明确递归退出条件
if(root==null) return ;
//递归主体
res.add(root.val);
target -=root.val;
if(root.left==null&&root.right==null&& target==0){
list.add(new LinkedList<Integer>(res));//这里!
}
dfs(root.left,target);
dfs(root.right,target);
res.removeLast();
}
}