Given a binary tree, count the number of uni-value subtrees.
A Uni-value subtree means all nodes of the subtree have the same value.
Example :
Input: root = [5,1,5,5,5,null,5]
5
/ \
1 5
/ \ \
5 5 5
Output: 4
自底向上, 返回的Result中要包含
- int _count : unisubtrees数
- boolean _isUni : 左右子树是否是uni的,如果有一个不是,则整棵树也不是uni
所以判断当前节点是否是uni : 要看左子树是否是uni 右子树是否是uni 当前节点的值是否等于左孩子的值,当前节点的值是否等于右孩子的值
class Solution {
public int countUnivalSubtrees(TreeNode root) {
return dfs(root)._count;
}
private Result dfs(TreeNode root) {
if (root == null) {
return new Result(0, true);
}
Result left = dfs(root.left);
Result right = dfs(root.right);
boolean isUni = left._isUni && right._isUni
&& (root.left == null || root.val == root.left.val)
&& (root.right == null || root.val == root.right.val);
int count = left._count + right._count + (isUni ? 1 : 0);
return new Result(count, isUni);
}
private class Result {
int _count;
boolean _isUni;
public Result(int count, boolean isUni) {
_count = count;
_isUni = isUni;
}
}
}