题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路:
1、当Tree1和Tree2都不为零的时候,才进行比较。否则直接返回false
2、
2.1
如果找到了对应Tree2的根节点的点,
以这个根节点为为起点判断是否包含Tree2
2.2
如果找不到,那么就再去root的左孩子当作起点,去判断时候包含Tree2
2.3
如果还找不到,那么就再去root的右孩子当作起点,去判断时候包含Tree2
1 public class Solution { 2 public static boolean HasSubtree(TreeNode root1, TreeNode root2) { 3 boolean result = false; 4 //当Tree1和Tree2都不为零的时候,才进行比较。否则直接返回false 5 if (root2 != null && root1 != null) { 6 //如果找到了对应Tree2的根节点的点 7 if(root1.val == root2.val){ 8 //以这个根节点为为起点判断是否包含Tree2 9 result = doesTree1HaveTree2(root1,root2); 10 } 11 //如果找不到,那么就再去root的左孩子当作起点,去判断时候包含Tree2 12 if (!result) { 13 result = HasSubtree(root1.left,root2); 14 } 15 16 //如果还找不到,那么就再去root的右孩子当作起点,去判断时候包含Tree2 17 if (!result) { 18 result = HasSubtree(root1.right,root2); 19 } 20 } 21 //返回结果 22 return result; 23 } 24 25 public static boolean doesTree1HaveTree2(TreeNode node1, TreeNode node2) { 26 //如果Tree2已经遍历完了都能对应的上,返回true 27 if (node2 == null) { 28 return true; 29 } 30 //如果Tree2还没有遍历完,Tree1却遍历完了。返回false 31 if (node1 == null) { 32 return false; 33 } 34 //如果其中有一个点没有对应上,返回false 35 if (node1.val != node2.val) { 36 return false; 37 } 38 39 //如果根节点对应的上,那么就分别去子节点里面匹配 40 return doesTree1HaveTree2(node1.left,node2.left) && doesTree1HaveTree2(node1.right,node2.right); 41 } 42 }