// WAclassSolution{TreeNode subRootInTree;publicbooleanisSubtree(TreeNode root,TreeNode subRoot){if(subRoot ==null)returntrue;if(root ==null)returnfalse;// Find the position of the root of the subRootsubRootPos(root, subRoot);// Check if existsif(subRootInTree ==null)returnfalse;// Check if the samereturncheck(root, subRootInTree);}privatevoidsubRootPos(TreeNode node,TreeNode subRoot){if(node ==null)return;if(node.val == subRoot.val){
subRootInTree = node;return;}// SearchsubRootPos(node.left, subRoot);subRootPos(node.right, subRoot);return;}privatebooleancheck(TreeNode node1,TreeNode node2){if(node1.val != node2.val)returnfalse;check(node1.left, node2.left);check(node1.right, node2.right);returntrue;}}
Code (AC)
classSolution{publicbooleanisSubtree(TreeNode root,TreeNode subRoot){// null is def. a subtree of rootif(subRoot ==null)returntrue;// def. false if no root to checkif(root ==null)returnfalse;// return true if they are the same treeif(sameTree(root, subRoot))returntrue;// Check left and rightreturnisSubtree(root.left, subRoot)||isSubtree(root.right, subRoot);}privatebooleansameTree(TreeNode node,TreeNode subRoot){// Both reached the endif(node ==null&& subRoot ==null)returntrue;// Keep searchingif(node !=null&& subRoot !=null&& node.val == subRoot.val){returnsameTree(node.left, subRoot.left)&&sameTree(node.right, subRoot.right);}// Doesn't correspondreturnfalse;}}