题目:
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
实现:
- 创建判断相同值子树方法isUnivalSubtrees, 判断其左、右节点与父节点是否相同,判定为Uni-value subtree(比较子节点与父节点val值时要先判断下对应left, right是否为空), 分别判断左子树和右子树的是否为Uni-value subtree, 如果是计数器累加。
- isUnivalSubtrees 时间 复杂度O(n) 嵌入 countUnivalSubtrees后 O(n^2)
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root: the given tree
* @return: the number of uni-value subtrees.
*/
int countUnivalSubtrees(TreeNode * root) {
int total = 0;
if (root == nullptr){
return 0;
}
total = countUnivalSubtrees(root->left) + countUnivalSubtrees(root->right);
if (isUnivalSubtrees(root)){
total +=1;
}
return total;
}
private:
bool isUnivalSubtrees(TreeNode * root){
if (root == nullptr) {
return true;
}
if (root->left!=nullptr && root->left->val != root->val) {
return false;
}
if (root->right!=nullptr && root->right->val != root->val){
return false;
}
if (isUnivalSubtrees(root->left) && isUnivalSubtrees(root->right)){
return true;
}
return false;
}
};
实现:
- 判断是否为Uni-value subtree的同时累计符合条件的子树数量,一起返回。
- O(N)
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root: the given tree
* @return: the number of uni-value subtrees.
*/
int countUnivalSubtrees(TreeNode * root) {
bool isUnival = true;
return helperCount(root, isUnival);
}
int helperCount(TreeNode *root, bool& isUnival) {
if (root == nullptr) {
isUnival = true;
return 0;
}
bool isLeftunival = true;
bool isRightunival = true;
int leftCount = 0;
int rightCount = 0;
leftCount = helperCount(root->left, isLeftunival);
rightCount = helperCount(root->right, isRightunival);
if (!isLeftunival || !isRightunival){
isUnival = false;
}
if (root->left !=nullptr && root->left->val != root->val ){
isUnival = false;
}
if (root->right !=nullptr && root->right->val != root->val ){
isUnival = false;
}
if (isUnival){
return leftCount+rightCount+1;
}
else {
return leftCount+rightCount;
}
}
};
实现:
- 使用C++ pair ,判断Uni-value subtree和累计值放到一起返回。
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root: the given tree
* @return: the number of uni-value subtrees.
*/
int countUnivalSubtrees(TreeNode * root) {
pair<int, bool> re = helperCount(root);
return re.first;
}
pair<int,bool> helperCount(TreeNode *root) {
pair<int, bool> res = {0, true};
if (root == nullptr) {
return res;
}
pair<int, bool> left, right;
left = helperCount(root->left);
right = helperCount(root->right);
if (!left.second || !right.second){
res.second = false;
}
if (root->left !=nullptr && root->left->val != root->val ){
res.second = false;
}
if (root->right !=nullptr && root->right->val != root->val ){
res.second = false;
}
if (res.second){
res = {left.first+right.first+1, true};
}
else {
res = {left.first+right.first, false};
}
return res;
}
};
参考及引用:
https://www.youtube.com/watch?v=7HgsS8bRvjo
Comments are closed.