题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
实现
步骤1:在树A找到与树B根节点值一样的节点R
步骤2:判断A中以R为根节点的子树是否包含B
/**26 树的子结构*/
public class C26_tree_SubTree {
static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
//1:在树A找到与树B根节点值一样的节点R --递归
public static boolean hasSubtree(TreeNode root1, TreeNode root2) {
boolean res = false;
if (root1 != null && root2 != null) {
if (root1.val == root2.val) {
res = tree1HaveTree2(root1, root2);//判断结构是否包含
}
if (!res) res = hasSubtree(root1.left, root2);
if (!res) res = hasSubtree(root1.right, root2);
}
return res;
}
//2:判断A中以R为根节点的子树是否包含B --递归
public static boolean tree1HaveTree2(TreeNode root1, TreeNode root2) {
if (root2 == null) return true;
if (root1 == null || (root1.val != root2.val)) return false;
return tree1HaveTree2(root1.left, root2.left)
&& tree1HaveTree2(root1.right, root2.right);
}
}
Test
public static void main(String[] args) {
TreeNode root1 = new TreeNode(8);
TreeNode node2 = new TreeNode(8);
TreeNode node3 = new TreeNode(7);
TreeNode node4 = new TreeNode(9);
TreeNode node5 = new TreeNode(2);
TreeNode node6 = new TreeNode(4);
TreeNode node7 = new TreeNode(7);
root1.left = node2;
root1.right = node3;
node2.left = node4;
node2.right = node5;
node5.left = node6;
node5.right = node7;
TreeNode root2 = new TreeNode(8);
TreeNode node21 = new TreeNode(9);
TreeNode node22 = new TreeNode(2);
root2.left = node21;
root2.right = node22;
System.out.println(hasSubtree(root1, root2));
}