题目
题解
对称性递归
概念
对称性递归:对一个对称的数据结构(如这里的二叉树)从整体的对称性思考,把大部分问题分解成子问题进行递归,即不是单独考虑一部分(比如树的左子树),而是同时考虑对称的部分(左右子树),从而写出对称性的代码
题型分类
解题模板
1. 递归结束条件
单树情况:
if(!root) return true/false;
if(!root->left) return true/false/递归函数;
if(!root->right) return true/false/递归函数;
双树情况:
if(!p && !q)return true/false;
if(!p || !q)return true/false;
有些还需要加上节点值的判断,具体问题具体分析。
2. 返回值:多个条件的复合判断语句,可能是以下几种条件判断的组合
节点非空判断
节点值比较判断
(单树)调用根节点左右子树的递归函数进行递归判断
(双树)调用两棵树的左右子树的递归函数进行判断
class Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
if(A==null||B==null)
return false;//空树不是任何树的子树
//根节点相同的话直接进入比较,根节点不相同看B是不是A的左/右子树的子结构
return dfs(A,B)||isSubStructure(A.left,B)||isSubStructure(A.right,B);
}
public boolean dfs(TreeNode A,TreeNode B){
if(B==null)
return true;//B到头了,说明A里含B
if(A==null||A.val!=B.val)
return false;
return dfs(A.left,B.left)&&dfs(A.right,B.right);//根节点值相同,比较左右子树
}
}