思路
本题其实就是个匹配问题。
树的匹配问题,第一步找到第一个匹配点,然后进行逐个匹配,找到第一个匹配点可以采用层次便利或者bfs、dfs等等。本题我首先使用了层次遍历,但是发现结果只超过5%,改成递归形式的dfs之后超过100%。估计是某些特殊的测试用例使用层次遍历会很慢。
然后第二步 从该节点开始进行遍历匹配,也是有很多选择,我选择了递归的dfs,并且在每个节点上进行了一些短路操作以减少不必要的递归开销。
代码
package algorithm.jianzhiOffer;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
public class Q26 {
public boolean isSubStructure(TreeNode A, TreeNode B) {
if (A == null || B == null) return false;
if (A.val == B.val) return sub(A, B);
return isSubStructure(A.left, B) || isSubStructure(A.right, B);
// Queue<TreeNode> q = new LinkedList<>();
// q.add(A);
// boolean re = false;
// while (!q.isEmpty()) {
// TreeNode a = q.poll();
// if (a.val == B.val){
// re = sub(a, B);
// return re;
// }
// if (a.left != null) q.add(a.left);
// if (a.right != null) q.add(a.right);
// }
// return re;
}
boolean sub(TreeNode a, TreeNode b) {
if (b == null) return true;
if (a == null || a.val != b.val || !sub(a.left, b.left)) return false;
return sub(a.right, b.right);
}
}