18面接の質問のJavaバージョンツリー「安全プランを証明する」下部

(二つのバイナリ入力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);
        }
    }

おすすめ

転載: www.cnblogs.com/czjk/p/11611905.html