子结构和子树
一 判断root2 是不是 root1 的子结构 空树不是任何树的子结构
/** Step1.在树root1中找到和root2的根结点的值一样的结点R; Step2.判断树root1中以R为根结点的子树是不是包含和树root2一样的结构。 很明显,这是一个递归的过程。 */ public class Solution { public boolean HasSubtree(TreeNode root1,TreeNode root2) { if(root2 == null || root1 == null) return false; return DoesTree1HasTree2(root1,root2)||HasSubtree(root1.left, root2) || HasSubtree(root1.right, root2); } //判断root2是不是以root1根为起始的子结构 public static boolean DoesTree1HasTree2(TreeNode root1,TreeNode root2){ if (root2 == null) return true; // 证明Tree2已经遍历结束,匹配成功 if (root1 == null) return false;// 证明Tree1已经遍历结束,匹配失败 if (root1.val != root2.val) return false; // 递归验证左子树和右子树是否包含Tree2 return DoesTree1HasTree2(root1.left, root2.left) && DoesTree1HasTree2(root1.right, root2.right); } }
二 判断root2 是不是 root1 的子树
子树就是树的其中一个节点以及其下面的所有的节点所构成的树。
/** Step1.在树root1中找到和root2的根结点的值一样的结点R; Step2.判断树root1中以R为根结点的树是不和树root2一样。 很明显,这是一个递归的过程。 */ public class Solution { public boolean isSubtree(TreeNode root1, TreeNode root2) { if(root1 == null) return false; return isSame(root1, root2) || isSubtree(root1.left, root2) || isSubtree(root1.right, root2); } public boolean isSame(TreeNode s, TreeNode t) { if(s == null && t == null) return true; if(s == null || t == null) return false; if(s.val != t.val) return false; return isSame(s.left, t.left) && isSame(s.right, t.right); } }