(二つのバイナリ入力A及びBは、Bは、ビューのコードブックによれば、下部サプリメントの部分構造ではないと判定され、下部の定義はヌルリーフノードを含まない、すなわち、デジタルのBの存在限り言うことです構成は、ライン中に存在するBがヌルツリーである場合、次に、それは)サブ構造Aに属していません
本方法:本方法は、非常にはっきりしている次いで点は構造によってダウン判定され、最初のツリーのツリーBではroot.valを見つけ、2つのステップに分割されているツリーがトラバースされるまで完全にBツリーを含んでいます。
public boolean isChild(TreeNode aRoot, TreeNode bRoot){
//A树没有遍历完而且B树不为空
if(aRoot != null && bRoot != null){
//在当前节点检查结构,或者去遍历当前节点的左节点或右节点。
return isQualified(aRoot, bRoot)
|| isChild(aRoot.left, bRoot)
|| isChild(aRoot.right, bRoot);
}
//A树遍历完了或者B树是个null
return false;
}
private boolean isQualified(TreeNode aRoot, TreeNode bRoot){
//检查到了B的末尾
if(bRoot == null)return true;
//如果在检查完B之前A到了底
if(aRoot == null)return false;
//都不是null且val相等,继续检查
if(aRoot.val == bRoot.val){
return isQualified(aRoot.left, bRoot.left)
&& isQualified(aRoot.right, bRoot.right);
}
//都不是null但是val不等
return false;
}
私の方法:(定義)はfalseを返し、その後、空、Bが空であるかどうかを確認してください起動します。aRootとbRootは2つのルートノードであり、そのルートノードと子ノードの間で切り換えることができます。開始時、及びaRoot.val bRoot.valが等しい場合には、各サブノードを比較し続け、モバイルaRootとbRootを等しくして比較されていない場合。
public boolean isChildTree(TreeNode aRoot, TreeNode bRoot){
//定义,如果B树为空,返回false
if(bRoot == null){
return false;
}
return isChild2(aRoot, bRoot);
}
private boolean isChild2(TreeNode aRoot, TreeNode bRoot){
//如果检查到了B的末尾
if(bRoot == null)return true;
//A到了末尾但是B没有
if(aRoot == null)return false;
//如果当前节点相同,进行进一步对比;
//对比的结果可能是false,此时继续向下检查aRoot.left与bRoot、aRoot.right与bRoot
if(aRoot.val == bRoot.val){
return (isChild2(aRoot.left, bRoot.left) && isChild2(aRoot.right, bRoot.right))
|| isChild2(aRoot.left, bRoot)
|| isChild2(aRoot.right, bRoot);
}else{//如果当前节点不同,继续向下检查aRoot.left与bRoot、aRoot.right与bRoot
return isChild2(aRoot.left, bRoot)
|| isChild2(aRoot.right, bRoot);
}
}