题目:
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.
For example:
Given binary tree,
5 / 1 5 / \ 5 5 5
return 4
.
链接: http://leetcode.com/problems/count-univalue-subtrees/
题解:
求Uni-value subtree的个数。对树来说这求count的首先思路就是递归了,不过这里要另外构造一个辅助函数来判断root为顶点的subtree是否是Uni-value subtree,假如是Uni-value的subtree,则结果可以+1,否则,我们返回递归求出的左子树的count和右节点的count。假如是Python的话可以一边计算一边返回。Java写起来可能稍微麻烦点。
Time Complexity - O(n), Space Complexity - O(1).
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public int countUnivalSubtrees(TreeNode root) { if(root == null) return 0; if(root.left == null && root.right == null) return 1; if(root.left == null) { if(isUniValueSubtree(root)) return countUnivalSubtrees(root.right) + 1; else return countUnivalSubtrees(root.right); } else if (root.right == null) { if(isUniValueSubtree(root)) return countUnivalSubtrees(root.left) + 1; else return countUnivalSubtrees(root.left); } else { if(isUniValueSubtree(root)) return countUnivalSubtrees(root.left) + countUnivalSubtrees(root.right) + 1; else return countUnivalSubtrees(root.left) + countUnivalSubtrees(root.right); } } private boolean isUniValueSubtree(TreeNode root) { if(root == null) return true; if(root.left == null && root.right == null) return true; else if (root.left != null && root.right != null) { if(root.val == root.left.val && root.val == root.right.val) return isUniValueSubtree(root.left) && isUniValueSubtree(root.right); else return false; } else if (root.left == null) { if(root.right.val == root.val) return isUniValueSubtree(root.right); else return false; } else { if(root.left.val == root.val) return isUniValueSubtree(root.left); else return false; } } }
Update: 优化一下
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public int countUnivalSubtrees(TreeNode root) { if(root == null) return 0; if(root.left == null && root.right == null) return 1; int res = countUnivalSubtrees(root.left) + countUnivalSubtrees(root.right) ; return isUniValueSubtree(root) ? res + 1 : res; } private boolean isUniValueSubtree(TreeNode root) { if(root == null) return true; if(root.left == null && root.right == null) return true; if(isUniValueSubtree(root.left) && isUniValueSubtree(root.right)) { if(root.left != null && root.right != null) return (root.left.val == root.right.val) && (root.left.val == root.val); else if(root.left != null) return root.left.val == root.val; else return root.right.val == root.val; } return false; } }
Update: 再优化一下。注意判断两个子树是否都为Uni-value subtree的时候用了 ‘&‘,这样才能判断两个条件,否则第一个条件为false时就不判断第二个了。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { private int count = 0; public int countUnivalSubtrees(TreeNode root) { if(root == null) return 0; isUniValueSubtree(root); return count; } private boolean isUniValueSubtree(TreeNode root) { if(root == null) return true; if(isUniValueSubtree(root.left) & isUniValueSubtree(root.right)) { if(root.left != null && root.left.val != root.val) return false; if(root.right != null && root.right.val != root.val) return false; count++; return true; } return false; } }
题外话:
这道题题号是250,马克一下。
Reference:
https://leetcode.com/discuss/66805/my-java-solution-using-a-boolean-helper-function
https://leetcode.com/discuss/68057/very-easy-java-solution-post-order-recursion
https://leetcode.com/discuss/63286/7-line-accepted-code-in-java
https://leetcode.com/discuss/52210/c-one-pass-recursive-solution
https://leetcode.com/discuss/50241/recursive-java-solution-with-explanation
https://leetcode.com/discuss/50357/my-concise-java-solution
https://leetcode.com/discuss/50420/java-11-lines-added
https://leetcode.com/discuss/68057/very-easy-java-solution-post-order-recursion
https://github.com/google/google-java-format
https://leetcode.com/discuss/55213/my-ac-java-code
https://leetcode.com/discuss/53431/java-solution-with-dfs
https://leetcode.com/discuss/50452/ac-clean-java-solution