私はこの答えなぜ私が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つの着信「TreeNode」が「null」になることを許可します。次に、再帰呼び出しを行うときに、 'null'オブジェクトを参照する可能性があります。 2番目のバージョンは、これをチェックすることによってそのベースをカバーしています。 –
「少しだけ」以上の違いがあります。正しいバージョンは、逆参照する前に 'null'の各参照変数をチェックします。それは大きく異なるものではなく、わずかです。それは "Aah"と "Aaaagh!"の違いです大きな違い。 –