您的位置:首页 > 产品设计 > UI/UE

250. Count Univalue Subtrees

2015-12-02 04:21 465 查看
题目:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: