题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
链接:https://www.nowcoder.com/questionTerminal/6e196c44c7004d15b1610b9afca8bd88
来源:牛客网
package offer;
public class Solution26 {
public boolean HasSubtree(TreeNode root1, TreeNode root2) {
if (root1 == null || root2 == null)
return false;
boolean result = false;
if (root1.val == root2.val)// 在A中找到了B的根结点
result = doseTree1HaveTree2(root1, root2); // 以这个根结点为起点判断是否包含B树
if (!result) // 如果上面的结果是不包含
result = HasSubtree(root1.left, root2); // 去A树刚刚找到的那个点的左子结点,再往下找和B树根结点值相等的点,然后再判断是否是子结构
if (!result)
result = HasSubtree(root1.right, root2); // 上面结果还是否,再看右子节点
// 至此已经把A树遍历完了
return result;
}
public static boolean doseTree1HaveTree2(TreeNode node1, TreeNode node2) {
// 如果B树已经遍历完了,说明在A树中都对上了
if (node2 == null)
return true;
// 如果A树遍历完了,而B树没有,那说明没有完全对上
if (node1 == null)
return false;
// 对不上
if (node1.val != node2.val)
return false;
// 递归返回的这个值,原本就带有循环的意思
return doseTree1HaveTree2(node1.left, node2.left) && doseTree1HaveTree2(node1.right, node2.right);
}
}