题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
分析
思路:
1、层次遍历root1, 找到与root2相同的节点
2、相同结点找到后判断以此节点为根节点,是否能在root1中找到与root2相同的树结构
实现代码如下:
import java.util.Queue;
import java.util.LinkedList;
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root1 == null || root2 == null){
return false; //空树不是任意一个树的子结构,两棵树的根节点均不空
}
//第一步、在root1中找到与root2根节点相同的结点,用层次遍历
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root1);
TreeNode cur;
while(!queue.isEmpty()){
int size = queue.size();
for(int i = 0 ; i < size ; i++){
cur = queue.poll(); //出队,cur接收出队结点
//找到与根节点root2相同的结点
if(cur.val == root2.val){
//判断子结构是否相等
if(isHasSubtreeHelper(cur, root2)){
return true;
}
}
if(cur.left != null){
queue.offer(cur.left);
}
if(cur.right != null){
queue.offer(cur.right);
}
}
}
return false;
}
//第二步:判断子结构是否相同
public boolean isHasSubtreeHelper(TreeNode root1, TreeNode root2) {
if (root2 == null) {
return true; //1、root2为空,说明root2遍历完毕,则返回true
}
if (root1 == null) {
return false; //2、root1为空,root2不为空,root1遍历完毕,root2还没有遍历完,返回false
}
if (root1.val != root2.val) {
return false; //3、两者都不为空,值不同,返回false
}
return isHasSubtreeHelper(root1.left, root2.left) && isHasSubtreeHelper(root1.right, root2.right);
}
}