题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路:
正确理解题意:子结构到底是啥意思?很容易弄混淆的是子树和子结构,下图黄色黄是子树,黑色框是子结构但不是子树
一棵大树 A,一棵小树 B,若 B 是 A 的子树,则:
B 和 A 的一个子节点C的结点值完全相同,它们俩的左子树、右子树所有结点的值也完全相同,子结构要求则没那么严格
1先写一个方法,传入两棵根节点值相同的树,判断tree2是否和tree1的子结构。
2再写一个方法来遍历大树tree1,找到一个和小树根节点值相等的节点,以该节点和小树根节点的值为参数调用上面的方法即可
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public boolean doesTree1HasTree2(TreeNode tree1, TreeNode tree2){
if ( tree2 == null ){
return true;
}
if ( tree1 == null ){
return false;
}
if ( tree1.val != tree2.val ){
return false;
}
return doesTree1HasTree2(tree1.left, tree2.left) && doesTree1HasTree2(tree1.right, tree2.right);
}
public boolean HasSubtree(TreeNode root1, TreeNode root2) {
if ( root2 == null || root1 == null){
return false;
}
return doesTree1HasTree2(root1, root2) || HasSubtree(root1.left, root2) || HasSubtree(root1.right, root2);
}
}