题目:输入两棵二叉树A和B,判断B是不是A的子结构。
思路:分成两步
- 在树A中找到和B的根节点的值一样的节点R;
- 判断树A中以R为根节点的子树是不是包含和树B一样的结构。
因此有两个函数,函数1遍历树A找到等于rootB的节点,函数2比较 “rootA” 是否包含 “rootB”。
// 找到tree1中等于tree2的root值相等的节点
public static boolean hasSubTree(TreeNode tree1, TreeNode tree2) {
boolean flag = false;
if (tree1 != null && tree2 != null) {
if (tree1.val == tree2.val)
flag = EqualTree(tree1, tree2);
if (!flag)
flag = EqualTree(tree1.left, tree2);
if (!flag)
flag = EqualTree(tree2.left, tree2);
}
return flag;
}
// 比较以root1开头的树是否包含root2开头的树
public static boolean EqualTree(TreeNode root1, TreeNode root2) {
if (root2 == null)
return true;
if (root1 == null)
return false;
if (root1.val != root2.val)
return false;
return EqualTree(root1.left, root2.left) && EqualTree(root1.right, root2.right);
}