2017-06-13 11 views
0

私はこの答えなぜ私がnullノードを渡すことはできませんが、私はnull値を渡すことができ

public TreeNode mergeTrees(TreeNode t1, TreeNode t2) { 
     // if both are null, assign merge tree to null 
     if (t1 == null && t2 == null) return null; 
     // if t1 or t2 is null, add 0 
     int sum = (t1 == null ? 0 : t1.val) + (t2 == null ? 0 : t2.val); 
     TreeNode tSum = new TreeNode(sum); // declare locally to prevent overwriting 
     tSum.right = mergeTrees(t1.right, t2.right); 
     tSum.left = mergeTrees(t1.left, t2.left); 
     return tSum; 
    } 

this leetcodeの質問を終え、T1またはT2がnullに等しい場合には、NullPointerExceptionがスローされます。しかし、私が正解を調べると、それはわずかに異なります。

public TreeNode mergeTrees(TreeNode t1, TreeNode t2) { 
     // if both are null, assign merge tree to null 
     if (t1 == null && t2 == null) return null; 
     // if t1 or t2 is null, add 0 
     int sum = (t1 == null ? 0 : t1.val) + (t2 == null ? 0 : t2.val); 
     TreeNode tSum = new TreeNode(sum); // declare locally to prevent overwriting 
     // pass null if either == null to avoid nullpointerexception 
     tSum.right = mergeTrees(t1 == null ? null : t1.right, t2 == null ? null : t2.right); 
     tSum.left = mergeTrees(t1 == null ? null : t1.left, t2 == null ? null : t2.left); 
     return tSum; 
    } 

ここで、左または右のノード値を渡す代わりに、nullが渡されます。

なぜ、両方のパラメータがnullのように見える場合、Javaは最初のケースでのみnullpointer例外をスローしますか?

+1

両方のバージョンのロジックは、少なくとも1つの着信「TreeNode」が「null」になることを許可します。次に、再帰呼び出しを行うときに、 'null'オブジェクトを参照する可能性があります。 2番目のバージョンは、これをチェックすることによってそのベースをカバーしています。 –

+0

「少しだけ」以上の違いがあります。正しいバージョンは、逆参照する前に 'null'の各参照変数をチェックします。それは大きく異なるものではなく、わずかです。それは "Aah"と "Aaaagh!"の違いです大きな違い。 –

答えて

0

nullオブジェクト(t1またはt2)に対して.rightメソッドを呼び出しています。 nullオブジェクトでメソッドを呼び出すと、null例外が発生します。

タイトルが正しくありません。ヌルノードを渡していない、ヌルノードの子を渡しています。

+0

清算していただきありがとうございます。これは多くの助けになります! – Ryan

関連する問題