思路
因为题解的特殊边界问题和搜索树时的跨层问题,需要将递归拆分和改造。
时间复杂度O(n),空间复杂度O(n)。
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
private boolean isSubTree(TreeNode A,TreeNode B, int deep) {
if(B == null) return true;
if(A == null) return false;
boolean flag = false;
if(A.val == B.val) {
// deep参数解决递归搜索时的跨层搜索问题
flag = isSubTree(A.left, B.left, 2) && isSubTree(A.right, B.right, 2);
}
// 仅当两树比对进行到第一层并不满足相等时,才搜索A的子树
// 若比对进行到非第一层,出现val不等则false
if(!flag && deep == 1) {
flag = isSubTree(A.left, B, 1) || isSubTree(A.right, B, 1);
}
return flag;
}
public boolean HasSubtree(TreeNode A, TreeNode B) {
boolean flag = false;
//递归出口的判断依赖于A、B的非空情况,根据题目ps的特殊要求,需要A、B都不空再递归
if(A != null && B != null) {
flag = isSubTree(A, B, 1);
}
return flag;
}
}
笔记
树的边界问题,跨层搜索问题可以通过递归携带deep解决。