题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
解答:
1.子结构相同指的是能在待匹配的树中找到一个相同形状和数值的树。这里和子树相同有些不一样。
public class Q_17 {
public boolean HasSubtree(TreeNode root1,TreeNode root2) { if(root2==null){ return false; } return HasSubtree1(root1,root2); } public boolean HasSubtree1(TreeNode root1,TreeNode root2) { if(root1!=null){ return Comparetree(root1, root2)||HasSubtree1(root1.left, root2) ||HasSubtree1(root1.right, root2); } return false; } //判断root2是否root1的一部分(ps 从根节点起开始比较) public boolean Comparetree(TreeNode root1,TreeNode root2){ if(root2==null){//如果匹配树的节点为null值,表明已经完全匹配,返回true return true; } if(root1==null&&root2!=null){//如果待匹配树的节点为null值,表明不匹配,返回false return false; } if(root1.val!=root2.val){ return false; }else{ return Comparetree(root1.left, root2.left)&&Comparetree(root1.right, root2.right); } } public static void main(String[] args) { TreeNode node_8_1=new TreeNode(8); TreeNode node_8_1_1=new TreeNode(8); TreeNode node_7_1=new TreeNode(7); TreeNode node_9_1=new TreeNode(9); TreeNode node_2_1=new TreeNode(2); node_8_1.left=node_8_1_1; node_8_1.right=node_7_1; node_8_1_1.left=node_9_1; node_8_1_1.right=node_2_1; TreeNode node_8=new TreeNode(8); TreeNode node_9=new TreeNode(9); TreeNode node_2=new TreeNode(2); node_8.left=node_9; node_8.right=node_2; System.out.println(new Q_17().HasSubtree(node_8_1, node_8)); }
}