[LeetCode] 250. Count Univalue Subtrees
Given the root
of a binary tree, return the number of uni-value subtrees.
A uni-value subtree means all nodes of the subtree have the same value.
Example 1:
Input: root = [5,1,5,5,5,null,5] Output: 4
Example 2:
Input: root = [] Output: 0
Example 3:
Input: root = [5,5,5,5,5,null,5] Output: 6
Constraints:
- The numbrt of the node in the tree will be in the range
[0, 1000]
. -1000 <= Node.val <= 1000
统计同值子树。
题意是给一个二叉树,请返回同值子树的个数。同值子树的定义是所有子树的节点值都相同。影子题687。
这个例子里面有4个同值子树,是哪四个呢?是三个叶子节点 + 右子树的两个5。因为他们都满足自身和他们的左右孩子(如存在)的值相同。
这个题思路是后序遍历(postorder),因为需要先知道叶子节点的值,才能判断当前节点的值是否和他们的孩子相同。这道题想到用后序遍历做不难,难点在于对于一个孩子节点,到底往他的父节点返回什么信息才有用。这道题比较特殊的地方是我们往父节点传的是一个 boolean 值,表示的是叶子节点和父节点的值是否相同。注意如果叶子节点不存在,也要返回 true。
时间O(n)
空间O(n)
Java实现
1 class Solution { 2 int count; 3 4 public int countUnivalSubtrees(TreeNode root) { 5 count = 0; 6 helper(root); 7 return count; 8 } 9 10 private boolean helper(TreeNode root) { 11 if (root == null) { 12 return true; 13 } 14 boolean left = helper(root.left); 15 boolean right = helper(root.right); 16 if (left && right) { 17 if (root.left != null && root.val != root.left.val) { 18 return false; 19 } 20 if (root.right != null && root.val != root.right.val) { 21 return false; 22 } 23 count++; 24 return true; 25 } 26 return false; 27 } 28 }
JavaScript实现
1 /** 2 * @param {TreeNode} root 3 * @return {number} 4 */ 5 var countUnivalSubtrees = function (root) { 6 let count = 0; 7 8 var helper = function (root) { 9 if (root == null) { 10 return true; 11 } 12 let left = helper(root.left); 13 let right = helper(root.right); 14 if (left && right) { 15 if (root.left != null && root.val != root.left.val) { 16 return false; 17 } 18 if (root.right != null && root.val != root.right.val) { 19 return false; 20 } 21 count++; 22 return true; 23 } 24 return false; 25 } 26 helper(root); 27 return count; 28 };
相关题目