在这种情况下,如何摆脱递归函数的全局变量?

时间:2018-01-05 19:56:01

标签: python algorithm recursion

我正在练习一些递归编码

          5
         / \
        1   5
       / \   \
      5   5   5

给定二叉树,计算单值子树的数量。

Uni-value子树意味着子树的所有节点都具有相同的值。

这是我提出的代码。但是,我必须将全局变量计算为uni-value的数量。我无法弄清楚如何摆脱它。这是我的代码。

def __init__(self):
    self.count = 0

def countUnivalSubtrees(self, root):
        def traverse(root):
            if not root:
                return {}

            count_left = traverse(root.left)
            count_right = traverse(root.right)

            for k, v in count_right.items():
                if k in count_left:
                    count_left[k] = count_left[k] + v
                else:
                    count_left[k] = v

            count_left[root.val] = count_left.get(root.val, 0) + 1
            if len(count_left.keys()) == 1:
                self.count += 1

            return count_left

        traverse(root)
        return self.count

1 个答案:

答案 0 :(得分:2)

这样的事情怎么样?

# returns (count_of_uni_value_subtrees, value)
# assumes nodes have a value other than None
def f(root, val):
  if not root:
    return (0, val)

  (left_count, left_val) = f(root.left, root.val)
  (right_count, right_val) = f(root.right, root.val)

  if left_val == root.val == right_val:
    return (1 + left_count + right_count, root.val)

  else:
    return (left_count + right_count, None)

"""
           f(5)
          /    \
        d(1)   e(5)
       /    \    \
      a(5)  b(5)  c(5)
"""
节点abc

(空)子节点各返回(0, 5)
abc均返回(1, 5) e的左(空)子项返回(0, 5)
d返回(2, None) e返回(2, 5) f会返回(4, None)