Broj podstabala koja imaju neparan broj parnih brojeva

Za dano binarno stablo pronađite broj podstabala koja imaju neparan broj parnih brojeva.

Primjeri:  

Input : 2 /  1 3 /  /  4 10 8 5 / 6 Output : 6 The subtrees are 4 6 1 8 3 /  /  4 10 8 5 / 6 2 /  1 3 /  /  4 10 8 5 / 6  

Ideja je rekurzivno prijeći stablo. Za svaki čvor rekurzivno prebrojite parne brojeve u lijevom i desnom podstablu. Ako je korijen također paran, dodajte ga također za brojanje. Ako broj postane neparan rezultat povećanja. 

count = 0 // Initialize result int countSubtrees(root) { if (root == NULL) return 0; // count even numbers in left subtree int c = countSubtrees(root-> left); // Add count of even numbers in right subtree c += countSubtrees(root-> right); // check if root data is an even number if (root-> data % 2 == 0) c += 1; // If total count of even numbers // for the subtree is odd if (c % 2 != 0) count++; // return total count of even // numbers of the subtree return c; } 

Implementacija:

C++
   // C++ implementation to find number of   // subtrees having odd count of even numbers   #include          using     namespace     std  ;   /* A binary tree Node */   struct     Node   {      int     data  ;      struct     Node  *     left       *  right  ;   };   /* Helper function that allocates a new Node with the    given data and NULL left and right pointers. */   struct     Node  *     newNode  (  int     data  )   {      struct     Node  *     node     =     new     Node  ;      node  ->  data     =     data  ;      node  ->  left     =     node  ->  right     =     NULL  ;      return  (  node  );   }   // Returns count of subtrees having odd count of   // even numbers   int     countRec  (  struct     Node  *     root       int     *  pcount  )   {      // base condition      if     (  root     ==     NULL  )      return     0  ;      // count even nodes in left subtree      int     c     =     countRec  (  root  ->  left       pcount  );      // Add even nodes in right subtree      c     +=     countRec  (  root  ->  right       pcount  );      // Check if root data is an even number      if     (  root  ->  data     %     2     ==     0  )      c     +=     1  ;      // if total count of even numbers      // for the subtree is odd      if     (  c     %     2     !=     0  )      (  *  pcount  )  ++  ;      // Total count of even nodes of the subtree      return     c  ;   }   // A wrapper over countRec()   int     countSubtrees  (  Node     *  root  )   {      int     count     =     0  ;      int     *  pcount     =     &  count  ;      countRec  (  root       pcount  );      return     count  ;   }   // Driver program to test above   int     main  ()   {      // binary tree formation      struct     Node     *  root     =     newNode  (  2  );     /* 2 */      root  ->  left     =     newNode  (  1  );     /* /  */      root  ->  right     =     newNode  (  3  );     /* 1 3 */      root  ->  left  ->  left     =     newNode  (  4  );     /* /  /  */      root  ->  left  ->  right     =     newNode  (  10  );     /* 4 10 8 5 */      root  ->  right  ->  left     =     newNode  (  8  );     /* / */      root  ->  right  ->  right     =     newNode  (  5  );     /* 6 */      root  ->  left  ->  right  ->  left     =     newNode  (  6  );      cout   < <  'Count = '   < <     countSubtrees  (  root  );      return     0  ;   }   // This code is contributed by famously.   
C
   // C implementation to find number of   // subtrees having odd count of even numbers   #include          /* A binary tree Node */   struct     Node   {      int     data  ;      struct     Node  *     left       *  right  ;   };   /* Helper function that allocates a new Node with the    given data and NULL left and right pointers. */   struct     Node  *     newNode  (  int     data  )   {      struct     Node  *     node     =     new     Node  ;      node  ->  data     =     data  ;      node  ->  left     =     node  ->  right     =     NULL  ;      return  (  node  );   }   // Returns count of subtrees having odd count of   // even numbers   int     countRec  (  struct     Node  *     root       int     *  pcount  )   {      // base condition      if     (  root     ==     NULL  )      return     0  ;      // count even nodes in left subtree      int     c     =     countRec  (  root  ->  left       pcount  );      // Add even nodes in right subtree      c     +=     countRec  (  root  ->  right       pcount  );      // Check if root data is an even number      if     (  root  ->  data     %     2     ==     0  )      c     +=     1  ;      // if total count of even numbers      // for the subtree is odd      if     (  c     %     2     !=     0  )      (  *  pcount  )  ++  ;      // Total count of even nodes of the subtree      return     c  ;   }   // A wrapper over countRec()   int     countSubtrees  (  Node     *  root  )   {      int     count     =     0  ;      int     *  pcount     =     &  count  ;      countRec  (  root       pcount  );      return     count  ;   }   // Driver program to test above   int     main  ()   {      // binary tree formation      struct     Node     *  root     =     newNode  (  2  );     /* 2 */      root  ->  left     =     newNode  (  1  );     /* /  */      root  ->  right     =     newNode  (  3  );     /* 1 3 */      root  ->  left  ->  left     =     newNode  (  4  );     /* /  /  */      root  ->  left  ->  right     =     newNode  (  10  );     /* 4 10 8 5 */      root  ->  right  ->  left     =     newNode  (  8  );     /* / */      root  ->  right  ->  right     =     newNode  (  5  );     /* 6 */      root  ->  left  ->  right  ->  left     =     newNode  (  6  );      printf  (  'Count = %d'       countSubtrees  (  root  ));      return     0  ;   }   
Java
   // Java implementation to find number of    // subtrees having odd count of even numbers    import     java.util.*  ;   class   GfG     {   /* A binary tree Node */   static     class   Node      {         int     data  ;         Node     left       right  ;      }   /* Helper function that allocates a new Node with the    given data and NULL left and right pointers. */   static     Node     newNode  (  int     data  )      {         Node     node     =     new     Node  ();         node  .  data     =     data  ;         node  .  left     =     null  ;      node  .  right     =     null  ;         return  (  node  );      }      // Returns count of subtrees having odd count of    // even numbers   static     class   P   {      int     pcount     =     0  ;   }   static     int     countRec  (  Node     root       P     p  )      {         // base condition       if     (  root     ==     null  )         return     0  ;         // count even nodes in left subtree       int     c     =     countRec  (  root  .  left       p  );         // Add even nodes in right subtree       c     +=     countRec  (  root  .  right       p  );         // Check if root data is an even number       if     (  root  .  data     %     2     ==     0  )         c     +=     1  ;         // if total count of even numbers       // for the subtree is odd       if     (  c     %     2     !=     0  )         (  p  .  pcount  )  ++  ;         // Total count of even nodes of the subtree       return     c  ;      }      // A wrapper over countRec()    static     int     countSubtrees  (  Node     root  )      {         P     p     =     new     P  ();         countRec  (  root       p  );         return     p  .  pcount  ;      }      // Driver program to test above    public     static     void     main  (  String  []     args  )      {         // binary tree formation       Node     root     =     newNode  (  2  );     /* 2 */      root  .  left     =     newNode  (  1  );     /* /  */      root  .  right     =     newNode  (  3  );     /* 1 3 */      root  .  left  .  left     =     newNode  (  4  );     /* /  /  */      root  .  left  .  right     =     newNode  (  10  );     /* 4 10 8 5 */      root  .  right  .  left     =     newNode  (  8  );     /* / */      root  .  right  .  right     =     newNode  (  5  );     /* 6 */      root  .  left  .  right  .  left     =     newNode  (  6  );      System  .  out  .  println  (  'Count = '     +     countSubtrees  (  root  ));      }      }      
Python3
   # Python3 implementation to find number of    # subtrees having odd count of even numbers    # Helper class that allocates a new Node    # with the given data and None left and   # right pointers.    class   newNode  :   def   __init__  (  self     data  ):   self  .  data   =   data   self  .  left   =   self  .  right   =   None   # Returns count of subtrees having odd    # count of even numbers    def   countRec  (  root     pcount  ):   # base condition    if   (  root   ==   None  ):   return   0   # count even nodes in left subtree    c   =   countRec  (  root  .  left     pcount  )   # Add even nodes in right subtree    c   +=   countRec  (  root  .  right     pcount  )   # Check if root data is an even number    if   (  root  .  data   %   2   ==   0  ):   c   +=   1   # if total count of even numbers    # for the subtree is odd    if   c   %   2   !=   0  :   pcount  [  0  ]   +=   1   # Total count of even nodes of   # the subtree    return   c   # A wrapper over countRec()    def   countSubtrees  (  root  ):   count   =   [  0  ]   pcount   =   count   countRec  (  root     pcount  )   return   count  [  0  ]   # Driver Code   if   __name__   ==   '__main__'  :   # binary tree formation    root   =   newNode  (  2  )   # 2    root  .  left   =   newNode  (  1  )   # /     root  .  right   =   newNode  (  3  )   # 1 3    root  .  left  .  left   =   newNode  (  4  )   # /  /     root  .  left  .  right   =   newNode  (  10  )   # 4 10 8 5    root  .  right  .  left   =   newNode  (  8  )   # /    root  .  right  .  right   =   newNode  (  5  )   # 6    root  .  left  .  right  .  left   =   newNode  (  6  )   print  (  'Count = '     countSubtrees  (  root  ))   # This code is contributed by PranchalK   
C#
   // C# implementation to find number of    // subtrees having odd count of even numbers    using     System  ;   class     GFG      {   /* A binary tree Node */   public     class     Node      {         public     int     data  ;         public     Node     left       right  ;      }   /* Helper function that allocates    a new Node with the given data and   NULL left and right pointers. */   static     Node     newNode  (  int     data  )      {         Node     node     =     new     Node  ();         node  .  data     =     data  ;         node  .  left     =     null  ;      node  .  right     =     null  ;         return  (  node  );      }      // Returns count of subtrees    // having odd count of even numbers   public     class     P   {      public     int     pcount     =     0  ;   }   static     int     countRec  (  Node     root       P     p  )      {         // base condition       if     (  root     ==     null  )         return     0  ;         // count even nodes in left subtree       int     c     =     countRec  (  root  .  left       p  );         // Add even nodes in right subtree       c     +=     countRec  (  root  .  right       p  );         // Check if root data is an even number       if     (  root  .  data     %     2     ==     0  )         c     +=     1  ;         // if total count of even numbers       // for the subtree is odd       if     (  c     %     2     !=     0  )         (  p  .  pcount  )  ++  ;         // Total count of even nodes of the subtree       return     c  ;      }      // A wrapper over countRec()    static     int     countSubtrees  (  Node     root  )      {         P     p     =     new     P  ();         countRec  (  root       p  );         return     p  .  pcount  ;      }      // Driver Code   public     static     void     Main  (  String  []     args  )      {         // binary tree formation       Node     root     =     newNode  (  2  );     /* 2 */      root  .  left     =     newNode  (  1  );     /* /  */      root  .  right     =     newNode  (  3  );     /* 1 3 */      root  .  left  .  left     =     newNode  (  4  );     /* /  /  */      root  .  left  .  right     =     newNode  (  10  );     /* 4 10 8 5 */      root  .  right  .  left     =     newNode  (  8  );     /* / */      root  .  right  .  right     =     newNode  (  5  );     /* 6 */      root  .  left  .  right  .  left     =     newNode  (  6  );         Console  .  WriteLine  (  'Count = '     +         countSubtrees  (  root  ));      }      }      // This code is contributed by 29AjayKumar   
JavaScript
    <  script  >   // Javascript implementation to find number of    // subtrees having odd count of even numbers    // A binary tree Node    class     Node      {          // Helper function that allocates a new      // Node with the given data and NULL left      // and right pointers.       constructor  (  data  )      {      this  .  data     =     data  ;      this  .  left     =     this  .  right     =     null  ;      }   }   // Returns count of subtrees having odd    // count of even numbers   class     P   {      constructor  ()      {      this  .  pcount     =     0  ;      }   }   function     countRec  (  root       p  )   {          // Base condition       if     (  root     ==     null  )         return     0  ;             // Count even nodes in left subtree       let     c     =     countRec  (  root  .  left       p  );             // Add even nodes in right subtree       c     +=     countRec  (  root  .  right       p  );             // Check if root data is an even number       if     (  root  .  data     %     2     ==     0  )         c     +=     1  ;             // If total count of even numbers       // for the subtree is odd       if     (  c     %     2     !=     0  )         (  p  .  pcount  )  ++  ;             // Total count of even nodes       // of the subtree       return     c  ;      }   // A wrapper over countRec()    function     countSubtrees  (  root  )   {      let     p     =     new     P  ();         countRec  (  root       p  );         return     p  .  pcount  ;      }   // Driver code   // Binary tree formation    let     root     =     new     Node  (  2  );     /* 2 */   root  .  left     =     new     Node  (  1  );     /* /  */   root  .  right     =     new     Node  (  3  );     /* 1 3 */   root  .  left  .  left     =     new     Node  (  4  );     /* /  /  */   root  .  left  .  right     =     new     Node  (  10  );     /* 4 10 8 5 */   root  .  right  .  left     =     new     Node  (  8  );     /* / */   root  .  right  .  right     =     new     Node  (  5  );     /* 6 */   root  .  left  .  right  .  left     =     new     Node  (  6  );      document  .  write  (  'Count = '     +     countSubtrees  (  root  )     +     '  
'
); // This code is contributed by rag2127 < /script>

Izlaz
Count = 6 

Vremenska složenost: O(n) // gdje je n broj čvorova u binarnom stablu.

Složenost prostora: Na)

 

Napravi kviz