2017-02-18 22 views
-1

更新されJavaのテスト2つのバイナリツリーが同じ

public boolean isSameTree(TreeNode p, TreeNode q) { 

    if(p==null&&q==null) return true; 
    if(p==null||q==null) return false; 

    return isSameTree(p.left, q.left)&&isSameTree(p.right, q.right)&&(p.val==q.val); 
} 

更新: はあなたのすべてをありがとう、私はあなたが私に言ったものを他のソリューションを知っているが、私の質問ですなぜ私のソリューションは動作しません。それは私がいくつかの戻り値を無視するためですか?ありがとうございました!私は2つのバイナリツリーが同じであるかどうかを判断するためのコードを書かれている


は、私は木を検索する再帰的な方法を使用しますが、このコードは時々動作しませんでした、あなたはそれを把握するために私を助けてください可能性?

ありがとうございます! ここでは、コードです:

/*Definition for a binary tree node. 
    public class TreeNode { 
    int val; 
    TreeNode left; 
    TreeNode right; 
    TreeNode(int x) { val = x; } 
*/ 

public boolean isSameTree(TreeNode p, TreeNode q) { 
    if(p!=null){ 
     if(q!=null&&p.val==q.val){ 
      isSameTree(p.left, q.left); 
      isSameTree(p.right, q.right); 
     } 
     else return false; 
    }else{ 
     if(q!=null) return false; 
    } 
    return true; 
} 

入力: [10,5,15] [10,5、NULL、NULL、15] 出力: 真 が予想される: 偽

+0

それはデバッグを開始する時間です、あなたの現在の出力は、ご希望の出力と一致していない、とあなたがなぜわからない場合。これについてどうやって行くのかわからない場合は、[小さなプログラムをデバッグする方法]を見てください。(http://ericlippert.com/2014/03/05/how-to-debug-small-プログラム/)。あなたの直接の問題を解決することはできませんが、あなた自身が解決するのに役立つ手順を教えてくれます。それでも問題が解決しない場合でも、質問をすることができます。より集中的で簡単に答えることができます。 –

+0

isSameTree()には戻り値があります。それを無視しないでください。 –

+0

@duffymo ==のために==を使うのは安全です –

答えて

0

あなたがしているが、子ツリーに対してはisSameTreeを呼び出すだけで、戻り値はチェックしません。簡潔で正しいバージョン:

@duffymoは、==の代わりに.equals()を使用する必要があると誤っていました。あなたはプリミティブであるvalを比較しています。

+0

p == qチェックは有効なチェックではありません。これは実際に解決しようとしている質問です – hhafeez

+0

両方が同じオブジェクトを参照する場合、それらは論理的に同等です。彼らは保証された深い比較を望むかどうかを指定しなかった。したがって、より効率的なソリューションを選択しました。 –

+0

これは検索方法とは関係ありません。 "彼らは同じオブジェクトを参照する場合"。まあ!私たちは解決しようとしていますか?これは実際の問題ではありませんか?私たちがp == qを知っていれば、解決するものはありません。他のすべてのif文が冗長である場合 – hhafeez

0
public boolean isSameTree(TreeNode p, TreeNode q) { 
     if(p!=null){ 
      if(q!=null&&p.val==q.val){ 
       if(!isSameTree(p.left, q.left)) return false; 
       if(!isSameTree(p.right, q.right)) return false; 
       return true; 
      } 
      else return false; 
     }else{ 
      if(q!=null) return false; 
     } 
     return true; 
    } 
+0

この解決策は間違っています。私のコメントの時点でコード:if(!isSameTree(p.left、q.left))falseを返します。 if(!isSameTree(p.right、q.right))はtrueを返します。右のサブツリーが等しくない場合はtrueを返してはなりません。 –

+1

@MattGoodrichあなたは正しいです。ありがとうございました! –

0

私はあなたが解決することができますデータを取得する方法を持っていると仮定しています。あなたは解決することができますisSameTreeメソッドはnull値を受け入れて比較することです。

public boolean isSameTree(TreeNode p, TreeNode q) { 

     if (p == q) { 
      return true; 
     } 
     if (p == null || q == null) { 
      return false; 
     } 

     return p.get().isSameTree(q.get()) && 
       isSameTree(p.left(), q.left()) && 
       isSameTree(p.right(), q.right()); 
    } 

もう一つの方法は以下の通りです:

public boolean isSameTree(TreeNode p, TreeNode q) 
    { 

     if (p == null && q == null) 
      return true; 


     if (p != null && q != null) 
      return (p.get == q.get 
        && isSameTree(p.left, q.left) 
        && isSameTree(p.right, q.right)); 


     return false; 
    } 
+0

チェックp == qは、OPが解決しようとしている実際の問題です – hhafeez

関連する問題