logo

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)

 

verilog parametar
Napravi kviz