1、题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
2、代码实现
package com.baozi.offer;
/**
* 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
*
* @author BaoZi
* @create 2019-07-12-14:11
*/
public class Offer14 {
public boolean HasSubtree(TreeNode root1, TreeNode root2) {
//判断树B是否是树A的子结构,那么树A和树B分别有两种情况
//1、A ==null&&B==null;
// 2、A ==null&&B!=null;
// 3、A !=null&&B!=null;
//4、A !=null&&B==null;
//经过这种情况判断之后只能是两个树A和B都是非空的树才能执行下边的判断
if (root2 == null) {
return false;
}
if (root1 == null && root2 != null) {
return false;
}
//定义一个boolean变量用于判断当前B的子树是否是A的子树结构
boolean flag = false;
//比较树B是否是树A 的子结构,我们的思路就是先找到树B的根节点在树A中的位置,当找到之后在逐一的比较
//两个子树的各个节点时候是一样的
if (root1.val == root2.val) {
flag = isSubtree(root1, root2);
}
//如果当前节点不是要找的节点,那么就通过递归的方式查找树A的左子树中是否存在树B的根节点值
if (!flag) {
flag = HasSubtree(root1.left, root2);
//如果左子树中不存在树B的根节点值,那么就通过递归的方式查找树A的右子树中是否存在树B的根节点值
if (!flag) {
flag = HasSubtree(root1.right, root2);
}
}
return flag;
}
//这个方法开始执行的时候就是root1和root2这两个子树的根节点是已经相等了
private boolean isSubtree(TreeNode root1, TreeNode root2) {
//接下来就是通过递归的方式来判断当前两个子树对应的各个节点是否是相等的
//当递归到某一次的时候,此时的root2中的节点为空,说明针对root2 的比较已经结束了,当然要
//返回true
if (root2 == null) {
return true;
}
//每次递归的遍历比较只能是两个待比较子树都要非空才能进行
if (root1 == null && root2 != null) {
return false;
}
if (root1.val == root2.val) {
return isSubtree(root1.left, root2.left) && isSubtree(root1.right, root2.right);
} else {
return false;
}
}
}
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
原文:https://www.cnblogs.com/BaoZiY/p/11176101.html