题目描述:
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路:
1. 如何遍历一棵树? 前序遍历
2. 在根节点相同的情况下,如何判断两棵树是否相同?
a. 当前节点相同
b. 左子树相同
c. 右子树相同
d. 递归
3. 在根节点相同的情况下,如何判断tree2是tree1的一部分?
按照2中的方法,在tree2遍历完毕的时候所有的节点都和tree1相同
代码
public class HasSubTree {
public static boolean hasSubTree(TreeNode root1, TreeNode root2) {
boolean result = false;
if (root1 != null && root2 != null) {
if (equal(root1.val, root2.val)) // 当前根节点和代查询子树根节点相同,则有可能有子结构
result = doseTree1HasTree2(root1, root2);
if (!result) // 查询左子树有没有
result = hasSubTree(root1.left, root2);
if (!result) // 查询右子树有没有
result = hasSubTree(root1.right, root2);
}
return result;
}
public static boolean doseTree1HasTree2(TreeNode root1, TreeNode root2) {
if (root2 == null) // 证明root2走到了叶节点了
return true;
if (root1 == null && root2 != null) // root2还有但是root1却没有了,证明是false
return false;
if (!equal(root1.val, root2.val))
return false;
// 这是root1 == root2 的情况。
return doseTree1HasTree2(root1.right, root2.right) && doseTree1HasTree2(root1.left, root2.left);
}
static boolean equal(double num1, double num2) {
if ((num1 - num2 < 1e-6) && (num2 - num1 < 1e-6))
return true;
else
return false;
}
public static void main(String[] args) {
}
}