思路:
先从根开始再把左作为根,再把右作为根由本函数决定。把一个为根的时候的具体比对过程是第二个函数决定。
从根可以认为是一颗树,从左子树开始又可以认为是另外一颗树,从右子树开始又是另外一棵树。
本函数就是判断这一整颗树包不包含树2,如果从根开始的不包含,就从左子树作为根节点开始判断,再不包含从右子树作为根节点开始判断。public class TreeNode{ int value; TreeNode left; TreeNode right; public TreeNode(int val){ this.value=val; } } //先从根开始再把左作为根,再把右作为根由本函数决定。把一个为根的时候的具体比对过程是第二个函数决定。 //从根可以认为是一颗树,从左子树开始又可以认为是另外一颗树,从右子树开始又是另外一棵树。 //本函数就是判断这一整颗树包不包含树2,如果从根开始的不包含,就从左子树作为根节点开始判断, //再不包含从右子树作为根节点开始判断。 //是整体算法递归流程控制。 public static boolean HasSubtree(TreeNode root1,TreeNode root2){ if(root1==null || root2==null){ return false; } return check(root1,root2) || HasSubtree(root1.left,root2) || HasSubtree(root1.right,root2); } //本函数,判断从当前的节点 ,开始两个树能不能对应上,是具体的比对过程 public static boolean check(TreeNode root1,TreeNode root2){ if(root2==null) { return true; } if(root1==null || root1.value!=root2.value){ return false; }//如果根节点可以对应上,那么就去分别比对左子树和右子树是否对应上 return check(root1.left,root2.left)&&check(root1.right,root2.right); }