输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public boolean HasSubtree(TreeNode root1, TreeNode root2) {
boolean res = false;
if (root1 != null && root2 != null) {// 只有两个根节点都不为空的时候才比较
if (root1.val == root2.val) {// 如果找到了在root1上对应的root2的根节点
// 以这个根节点为起点判断是否包含root2
res = doesTree1HasTree2(root1, root2);
}
// 如果没有找到再去root1的左孩子节点为起点,去判断是否包含root2
if (!res) {
res = HasSubtree(root1.left, root2);
}
// 如果还没有找到再去右孩子节点为起点,去判断时候包含root2
if (!res) {
res = HasSubtree(root1.right, root2);
}
}
return res;
}
public boolean doesTree1HasTree2(TreeNode node1, TreeNode node2) {
if (node2 == null) {// 如果root2已经遍历完了,返回true
return true;
}
if (node1 == null) {// 如果root1遍历完了,但是root2已经遍历完了则返回 false
return false;
}
if (node1.val != node2.val)
return false;
// 如果根节点对应,分别取左右子节点匹配
return doesTree1HasTree2(node1.left, node2.left) && doesTree1HasTree2(node1.right, node2.right);
}
}