Description
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
Problem URL
Solution
给一棵树,找到树中有多少子树是uni-value的,定义是子树中所有node的val都是一样的。注意这棵树本身也是子树的。
Using a recursion helper to help resolve this problem. Using a global variable to store count result. The recursion helper judge wether a substree start at this node is a uni-value tree or not. It returns boolean to upper level calls to help get count;
If node == null, simply return true for null pointers is out of our consideration. Then recursively get the uni-value information of left and right. If left and right are both true, it means they have the same value as this node. res++, then judge this node is uni-value with its parent or not, return the euqal’s result. If its right and left child is not uni-value, simply return false.
Code
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private int res = 0;
public int countUnivalSubtrees(TreeNode root) {
if (root == null){
return res;
}
helper(root, root.val);
return res;
}
private boolean helper(TreeNode node, int value){
if (node == null){
return true;
}
boolean left = helper(node.left, node.val);
boolean right = helper(node.right, node.val);
if (left && right){
res++;
return node.val == value;
}
return false;
}
}
Time Complexity: O(n)
Space Complexity: O(1)