题目描述:输入两棵二叉树A,B,判断B是不是A的子结构(约定空树不是任意一棵树的子结构)
思路:
1.首先设置标志位result=false,因为一旦匹配成功,则将标志位置为真,如果匹配不成功,则默认返回false
2.递归思想,若根节点相同,则递归调用DoseTree1hasTree2(),若根节点不同,则判断tree1的左子树和tree2是否相同,再判断tree1的右子树和tree2是否相同
3.判断null的条件,当两棵树都不为空的时候才开始判断是否是子树。
在DoseTree1hasTree2()中,当tree2遍历结束,则匹配成功,tree1为空有两种情况,1)仅1为空,则不匹配;2)两棵树都为空,则遍历成功。
求解结果:
1 /** 2 public class TreeNode { 3 int val = 0; 4 TreeNode left = null; 5 TreeNode right = null; 6 7 public TreeNode(int val) { 8 this.val = val; 9 10 } 11 12 } 13 */ 14 public class Solution { 15 public static boolean HasSubtree(TreeNode root1,TreeNode root2) { 16 boolean result = false; 17 //当两棵树都不为空的时候,才进行比较。否则直接返回false 18 if(root1!=null&&root2!=null){ 19 //如果找到了对应Tree2的根节点的点 20 if(root1.val == root2.val){ 21 //以该跟节点为起点判断是否包含Tree2 22 result = doseTree1hasTree2(root1,root2); 23 } 24 //若没找到,则以Tree1的左子树和右子树来判断Tree2是否是其子树 25 if(!result){ 26 result = HasSubtree(root1.left,root2) || HasSubtree(root1.right,root2); 27 } 28 } 29 //返回结果 30 return result; 31 } 32 public static boolean doseTree1hasTree2(TreeNode node1,TreeNode node2){ 33 //若Tree2已经遍历完了,都能对应上,则返回True 34 if(node2==null) 35 return true; 36 //若Tree1已经遍历完了,而Tree2却没遍历完,则返回false 37 if(node1==null) 38 return false; 39 //如果其中一个点没有对应上,则返回false 40 if(node1.val!=node2.val) 41 return false; 42 //若根节点对应得上,则去其子节点中匹配 43 return doseTree1hasTree2(node1.left,node2.left) && doseTree1hasTree2(node1.right,node2.right); 44 } 45 }