/**
* 面试题26:树的子结构
* 题目:输入两棵二叉树A和B,判断B是不是A的子结构。
* @author
* @create 2021-04-22 12:16
*/
public class Solution26 {
public static void main(String[] args) {
TreeNode root1 = new TreeNode(8);
TreeNode node1 = new TreeNode(8);
TreeNode node2 = new TreeNode(7);
TreeNode node3 = new TreeNode(9);
TreeNode node4 = new TreeNode(2);
TreeNode node5 = new TreeNode(4);
TreeNode node6 = new TreeNode(7);
//搭建第一棵二叉树
root1.left = node1;
root1.right = node2;
node1.left = node3;
node1.right = node4;
node4.left = node5;
node4.right = node6;
TreeNode root2 = new TreeNode(8);
TreeNode nodeB1 = new TreeNode(9);
TreeNode nodeB2 = new TreeNode(2);
//搭建第二棵二叉树
root2.left = nodeB1;
root2.right = nodeB2;
boolean hasSub = hasSubTree(root1, root2);
System.out.println(hasSub);
}
public static boolean hasSubTree(TreeNode root1, TreeNode root2){
if (root1 == null || root2 == null){
return false;
}
boolean result = false;
if (root1.val == root2.val){
//在树A中找到和树B根节点的一样的节点R,判断树A中以R为根节点的子树是不是包含和树B一样的结构
result = doesTree1HaveTree2(root1,root2);
}
if (!result){
//如果没找到,先往树A的左边找
result = hasSubTree(root1.left, root2);
}
if (!result){
//向树A的右边找
result = hasSubTree(root1.right,root2);
}
return result;
}
public static boolean doesTree1HaveTree2(TreeNode root1, TreeNode root2){
if (root2 == null){
return true;
}
if (root1 == null){
return false;
}
if (root1.val != root2.val){
return false;
}
//递归判断左子树和右子树是否相等
return doesTree1HaveTree2(root1.left,root2.left) &&
doesTree1HaveTree2(root1.right, root2.right);
}
}
08-06
3760
04-08
2962
04-08
1521
07-12
1478