描述
输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构) 假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2},2个树的结构如下,可以看出B是A的子结构
思路:递归
递归遍历大树的每个节点,和小树进行比较。时间复杂度O(MN)。M为A的节点数,N为B的节点数
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root1 == null || root2 == null) {
return false;
}
boolean r1 = isEqual(root1, root2);
boolean r2 = HasSubtree(root1.left, root2);
boolean r3 = HasSubtree(root1.right, root2);
return r1 || r2 || r3;
}
boolean isEqual(TreeNode root1, TreeNode root2) {
// 小树遍历完成,说明全部节点匹配
if(root2 == null) {
return true;
}
if(root1 == null || root1.val != root2.val) {
return false;
}
// 递归比较左右节点
return isEqual(root1.left, root2.left) && isEqual(root1.right, root2.right);
}
}
思路2:借助队列
使用队列对大树进行层序遍历
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root1 == null || root2 == null) {
return false;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root1);
while(!queue.isEmpty()) {
TreeNode node = queue.poll();
if(isEqual(node, root2)) {
return true;
}
if(node.left != null) {
queue.offer(node.left);
}
if(node.right != null) {
queue.offer(node.right);
}
}
return false;
}
boolean isEqual(TreeNode root1, TreeNode root2) {
if(root2 == null) {
return true;
}
if(root1 == null || root1.val != root2.val) {
return false;
}
return isEqual(root1.left, root2.left) && isEqual(root1.right, root2.right);
}
}