1、题目内容
2、题目分析
本题是【对称二叉树】的引申,局部进行【二叉树对称的判定】,然后主二叉树逐步递归到各个分支逻辑,进行判定,进行二次循环递归逻辑。
【树的深度优先算法】
【搜索与回溯】是计算机解题中常用的算法,很多问题无法根据某种确定的计算法则来求解,可以利用搜索与回溯的技术求解。它的基本思想是:为了求得问题的解,先选择某一种可能情况向前探索,在探索过程中,一旦发现原来的选择是错误的,就退回一步重新选择,继续向前探索,如此反复进行,直至得到解或证明无解。
3、代码实现
class Solution {
//对称二叉树的判定引申到--> 子树是否是对称二叉树,二次递归
//主函数递归,验证B是否是A的子树
public boolean isSubStructure(TreeNode A, TreeNode B) {
if(B == null || A == null) return false;
return check(A,B) || isSubStructure(A.left, B) || isSubStructure(A.right, B);
}
// dfs验证是否是对称树
private boolean check(TreeNode A, TreeNode B){
if(B==null) return true;
if(A==null || A.val!=B.val) return false;
return check(A.left, B.left) && check(A.right, B.right);
}
}
时间复杂度 O(MN): 其中 M,N 分别为树 A 和 树 B 的节点数量;先序遍历树 A 占用 O(M) ,每次调用 recur(A, B) 判断占用 O(N) 。
空间复杂度 O(M): 当树 A 和树 B 都退化为链表时,递归调用深度最大。当 M≤N 时,遍历树 A 与递归判断的总递归深度为 M ;当 M>N 时,最差情况为遍历至树 A 叶子节点,此时总递归深度为 M。