CSC301: Tree code: The winner is... [50/56] |
public int size () { return size (root); } private int size (Node x) { if (x == null) return 0; int sz = 1; sz += size (x.left); sz += size (x.right); return sz; } |
public int size () { if (root == null) return 0; return size (root); } private int size (Node x) { int sz = 1; if (x.left != null) sz += size (x.left); if (x.right != null) sz += size (x.right); return sz; } |
nullable
version has less redundancy. Easier to maintain. Full of win.
non-nullable
version is also known as Too many base cases!
.
Only prefer performance over maintainability if you have determined that the performance is an actual problem and you have done profiling to determine the actual location of the problem.
One of the trickiest things for Java programmers is to keep track of when a variable is nullable.
Recent languages such as
swift
and
kotlin
distinguish nullable and non-nullable types. In these languages, a
variable that may be null must be given a type that ends in a
question mark. (In swift, null
is written
nil
, or equivalently as Optional.none
.)
In these languages, we would give different types to the argument
in the helper function above. For the nullable version, x
would be given type Node?
whereas for the non-nullable
version, it would be given type Node
.