zoukankan      html  css  js  c++  java
  • [LeetCode] 250. Count Univalue Subtrees 计算唯一值子树的个数

    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.

    给一个二叉树,求唯一值子树的个数。唯一值子树的所有节点具有相同值。

    解法:递归

    Java:

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    public class Solution {
        int count = 0;
        
        public int countUnivalSubtrees(TreeNode root) {
            if (root == null) return 0;
            isUnival(root);
            return count;
        }
        
        private boolean isUnival(TreeNode root) {
            if (root == null) return true;
            if (isUnival(root.left) & isUnival(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;
        }
    }  

    Java:

    public class Solution {
        public int countUnivalSubtrees(TreeNode root) {
            int[] count = new int[] {0};
            isUnivalSubtrees(root,count);
            return count[0];
        }
        
        private boolean isUnivalSubtrees(TreeNode root, int[] count) {
            if(root == null) return true;
            
            boolean left = isUnivalSubtrees(root.left, count);
            boolean right = isUnivalSubtrees(root.right, count);
            if(left && right) {
                if(root.left != null && root.left.val != root.val) {
                    return false;
                }
                if(root.right != null && root.right.val != root.val) {
                    return false;
                }
                count[0]++;
                return true;
            }
            return false;
        }
    }  

    Python:

    # Time:  O(n)
    # Space: O(h)
    class Solution(object):
        # @param {TreeNode} root
        # @return {integer}
        def countUnivalSubtrees(self, root):
            [is_uni, count] = self.isUnivalSubtrees(root, 0);
            return count;
    
        def isUnivalSubtrees(self, root, count):
            if not root:
                return [True, count]
    
            [left, count] = self.isUnivalSubtrees(root.left, count)
            [right, count] = self.isUnivalSubtrees(root.right, count)
            if self.isSame(root, root.left, left) and 
               self.isSame(root, root.right, right):
                    count += 1
                    return [True, count]
    
            return [False, count]
    
        def isSame(self, root, child, is_uni):
            return not child or (is_uni and root.val == child.val)
    

    C++:

    // Time:  O(n)
    // Space: O(h)
    
    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        int countUnivalSubtrees(TreeNode* root) {
            int count = 0;
            isUnivalSubtrees(root, &count);
            return count;
        }
        
        bool isUnivalSubtrees(TreeNode* root, int *count) {
            if (root == nullptr) {
                return true;
            }
            bool left = isUnivalSubtrees(root->left, count);
            bool right = isUnivalSubtrees(root->right, count);
            if (isSame(root, root->left, left) &&
                isSame(root, root->right, right)) {
                    ++(*count);
                    return true;
            }
            return false;
        }
        
        bool isSame(TreeNode* root, TreeNode* child, bool is_uni) {
            return child == nullptr || (is_uni && root->val == child->val);
        }
    };
    

      

    类似题目:

    [LeetCode] 687. Longest Univalue Path 最长唯一值路径

    All LeetCode Questions List 题目汇总

  • 相关阅读:
    构造函数与其他类方法的区别
    将博客搬至51CTO
    易错点
    c++类构造函数详解
    将博客搬至CSDN
    实数,有理数,无理数,自然数,整数的概念分别是什么?
    code for qint function
    spline和Pchips的不同(matlab)
    Pseudocode MD5 CODE
    git基础介绍
  • 原文地址:https://www.cnblogs.com/lightwindy/p/9795764.html
Copyright © 2011-2022 走看看