# Ruby Golf .....

• Golf version:

``````def count_unival_subtrees(r)
c=0;u=->r{c+=1if[r.left,r.right].map{|k|!k||u[k]&&k.val==r.val}.all?};r&&u[r];c
end
``````

``````def count_unival_subtrees(root)
count = 0
unival = -> root {
count += 1 if [root.left, root.right]
.map { |kid| !kid || unival[kid] && kid.val == root.val }
.all?
}
unival[root] if root
count
end``````

``````def countUnivalSubtrees(self, root):
def f(root):
if not root: return 0, set()
nbl, dl, nbr, dr = f(root.left) + f(root.right)
d = dl | dr | {root.val}
return nbl + nbr + (len(d) == 1), d
return f(root)[0]
``````

• @agave Ok, here's another one:

``````def countUnivalSubtrees(self, root):
def f(r, v):
if not r: return 0
x = f(r.left, r.val) + f(r.right, r.val)
return x + (x.imag < 1) + (r.val != v) * 1j
return int(f(root, 0).real)``````

• @StefanPochmann nice job but the code is not intelligible :D

• @agave Meh, totally easy. The real part is the number of unival subtrees, and the imaginary part is the number of violations (where a child doesn't match the parent's value). So just add those from the two subtrees, and increment them as appropriate (increment the number of unival subtrees if there's no violation, and increment the number of violations if this node doesn't match its parent).

Looks like your connection to LeetCode Discuss was lost, please wait while we try to reconnect.