1.题目
2.思路
1.遍历A的每个节点进行dfs判断是否为子树
2.dfs函数判断A 和 B是否为子树,B == null ,就说明true。
2.1注意当node.val == B.val时,一定返回的是左子树和右子树同时为子树,也就是说为与 && 的关系,而不是或 ||。
return dfs(node.left, B.left ) && dfs(node.right, B.right)
2.2自己写得用队列存储所有节点,时间复杂度应该也是O(MN),为什么提交是10ms, 参考别人的,不写队列或者栈,直接递归,就0ms?
可能是因为存在队列的进入和出,费时间,时间复杂度应该是一样的。就像dfs的递归和非递归写法一样,非递归写法往往都要慢一些。
10ms版本--O(MN)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
if(B == null) return false;
if(A == B) return true;
if(A == null) return false;
System.out.println(A.val + " ");
Deque<TreeNode>d = new ArrayDeque();
d.add(A);
while(!d.isEmpty()){
TreeNode node = d.poll();
// if(node == null) continue;
if(dfs(node, B)) return true;
if(node.left != null)
d.addLast(node.left);
if(node.right != null)
d.addLast(node.right);
// System.out.println(node.val + " ");
}
return false;
}
public boolean dfs(TreeNode node, TreeNode B){
if(B == null) return true;
if(node == null) return false;
if(node == B)return true;
// System.out.println(node.val + " 11 ");
if(node.val == B.val){
// System.out.println(node.val + " 1222 ");
return dfs(node.left, B.left) && dfs(node.right, B.right);
}
return false;
}
}
0ms版本--O(MN)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
if(B == null) return false;
if(A == B) return true;
if(A == null) return false;
// System.out.println(A.val + " ");
// Deque<TreeNode>d = new ArrayDeque();
// d.add(A);
// while(!d.isEmpty()){
// TreeNode node = d.poll();
// if(dfs(node, B)) return true;
// if(node.left != null)
// d.addLast(node.left);
// if(node.right != null)
// d.addLast(node.right);
// }
return dfs(A, B) || isSubStructure(A.left, B) ||isSubStructure(A.right, B);
}
public boolean dfs(TreeNode node, TreeNode B){
if(B == null) return true;
if(node == null) return false;
if(node == B)return true;
if(node.val == B.val){
return dfs(node.left, B.left) && dfs(node.right, B.right);
}
return false;
}
}
3.结果