Recuento de subárboles en un árbol binario con valor XOR K

Dado un valor K y un árbol binario , la tarea es encontrar el número de subárboles que tienen XOR de todos sus elementos igual a K.
Ejemplos: 
 

Input  K = 5, Tree =
       2
      / \
     1   9
    / \
   10  5
Output: 2
Explanation:
Subtree 1: 
       5
It has only one element i.e. 5.
So XOR of subtree = 5
Subtree 1: 
       2
      / \
     1   9
    / \
   10  5
It has elements 2, 1, 9, 10, 5.
So XOR of subtree = 2 ^ 1 ^ 9 ^ 10 ^ 5 = 5

Input  K = 3, Tree =
       4
      / \
     3   9
    / \
   2   2
Output: 1
Explanation
Subtree:
     3
    / \
   2   2
It has elements 3, 2, 2.
So XOR of subtree = 3 ^ 2 ^ 2 = 3

Acercarse 
 

  1. Atraviese el árbol de forma recursiva mediante pre-order traversal .
  2. Para cada Node, siga calculando el XOR de su subárbol como: 
     

XOR de su subárbol = (XOR del subárbol izquierdo del Node) ^ (XOR del subárbol derecho de los Nodes) ^ (valor del Node)

  1.  
  2. Si el XOR de cualquier subárbol es K, incremente la variable de contador.
  3. Imprime el valor en el contador como el conteo requerido

A continuación se muestra la implementación del enfoque anterior: 
 

C++

// C++ program to find the count of
// subtrees in a Binary Tree
// having XOR value K
 
#include <bits/stdc++.h>
using namespace std;
 
// A binary tree node
struct Node {
    int data;
    struct Node *left, *right;
};
 
// A utility function to
// allocate a new node
struct Node* newNode(int data)
{
    struct Node* newNode = new Node;
    newNode->data = data;
    newNode->left
        = newNode->right = NULL;
    return (newNode);
}
 
int rec(Node* root, int& res, int& k)
{
    // Base Case:
    // If node is NULL, return 0
    if (root == NULL) {
        return 0;
    }
 
    // Calculating the XOR
    // of the current subtree
    int xr = root->data;
    xr ^= rec(root->left, res, k);
    xr ^= rec(root->right, res, k);
 
    // Increment res
    // if xr is equal to k
    if (xr == k) {
        res++;
    }
 
    // Return the XOR value
    // of the current subtree
    return xr;
}
 
// Function to find the required count
int findCount(Node* root, int K)
{
    // Initialize result variable 'res'
    int res = 0;
 
    // Recursively traverse the tree
    // and compute the count
    rec(root, res, K);
 
    // return the count 'res'
    return res;
}
 
// Driver program
int main(void)
{
 
    /*
        2
       / \
      1   9
     / \
    10  5
    */
 
    // Create the binary tree
    // by adding nodes to it
    struct Node* root = newNode(2);
    root->left = newNode(1);
    root->right = newNode(9);
    root->left->left = newNode(10);
    root->left->right = newNode(5);
 
    int K = 5;
 
    cout << findCount(root, K);
    return 0;
}

Java

// Java program to find the count of
// subtrees in a Binary Tree
// having XOR value K
import java.util.*;
 
class GFG{
 
    // A binary tree node
    static class Node
    {
        int data;
        Node left,right;
    };
    static int res;
    static int k;
 
    // A utility function to
    // allocate a new node
    static Node newNode(int data)
    {
        Node newNode = new Node();
        newNode.data = data;
        newNode.left= null;
        newNode.right = null;
        return newNode;
    }
     
    static int rec(Node root)
    {
        // Base Case:
        // If node is null, return 0
        if (root == null) {
            return 0;
        }
     
        // Calculating the XOR
        // of the current subtree
        int xr = (root.data);//^rec(root.left)^rec(root.right);
        xr ^= rec(root.left);
        xr ^= rec(root.right);
         
        // Increment res
        // if xr is equal to k
        if (xr == k) {
            res++;
        }
     
        // Return the XOR value
        // of the current subtree
        return xr;
    }
     
    // Function to find the required count
    static int findCount(Node root, int K)
    {
        // Initialize result variable 'res'
        res = 0;
        k = K;
 
        // Recursively traverse the tree
        // and compute the count
        rec(root);
 
        // return the count 'res'
        return res;
    }
     
    // Driver program
    public static void main(String args[])
    {
     
        /*
            2
        / \
        1 9
        / \
        10 5
        */
     
        // Create the binary tree
        // by adding nodes to it
        Node root = newNode(2);
        root.left = newNode(1);
        root.right = newNode(9);
        root.left.left =newNode(10);
        root.left.right = newNode(5);
     
        int K = 5;
     
        System.out.println(findCount(root, K));   
    }
}
 
 
// This code is contributed by AbhiThakur

Python3

# Python3 program to find the count of
# subtrees in a Binary Tree
# having XOR value K
  
# A binary tree node
class Node:
     
    def __init__(self, data):
         
        self.data = data
        self.left = None
        self.right = None
         
# A utility function to
# allocate a new node
def newNode(data):
     
    newNode = Node(data)
    return newNode
 
def rec(root, res, k):
 
    # Base Case:
    # If node is None, return 0
    if (root == None):
        return [0, res];
  
    # Calculating the XOR
    # of the current subtree
    xr = root.data;
    tmp,res = rec(root.left, res, k);
    xr^=tmp
    tmp,res = rec(root.right, res, k);
    xr^=tmp
  
    # Increment res
    # if xr is equal to k
    if (xr == k):
        res += 1
   
    # Return the XOR value
    # of the current subtree
    return xr, res;
 
# Function to find the required count
def findCount(root, K):
 
    # Initialize result variable 'res'
    res = 0;
  
    # Recursively traverse the tree
    # and compute the count
    tmp,res=rec(root, res, K);
  
    # return the count 'res'
    return res;
 
# Driver program
if __name__=='__main__':
  
    '''
        2
       / \
      1   9
     / \
    10  5
    '''
  
    # Create the binary tree
    # by adding nodes to it
    root = newNode(2);
    root.left = newNode(1);
    root.right = newNode(9);
    root.left.left = newNode(10);
    root.left.right = newNode(5);
  
    K = 5;
  
    print(findCount(root, K))
 
# This code is contributed by rutvik_56

C#

// C# program to find the count of
// subtrees in a Binary Tree
// having XOR value K
using System;
 
public class GFG{
  
    // A binary tree node
    class Node
    {
        public int data;
        public Node left,right;
    };
    static int res;
    static int k;
  
    // A utility function to
    // allocate a new node
    static Node newNode(int data)
    {
        Node newNode = new Node();
        newNode.data = data;
        newNode.left= null;
        newNode.right = null;
        return newNode;
    }
      
    static int rec(Node root)
    {
        // Base Case:
        // If node is null, return 0
        if (root == null) {
            return 0;
        }
      
        // Calculating the XOR
        // of the current subtree
        int xr = (root.data);//^rec(root.left)^rec(root.right);
        xr ^= rec(root.left);
        xr ^= rec(root.right);
          
        // Increment res
        // if xr is equal to k
        if (xr == k) {
            res++;
        }
      
        // Return the XOR value
        // of the current subtree
        return xr;
    }
      
    // Function to find the required count
    static int findCount(Node root, int K)
    {
        // Initialize result variable 'res'
        res = 0;
        k = K;
  
        // Recursively traverse the tree
        // and compute the count
        rec(root);
  
        // return the count 'res'
        return res;
    }
      
    // Driver program
    public static void Main(String []args)
    {
      
        /*
            2
        / \
        1 9
        / \
        10 5
        */
      
        // Create the binary tree
        // by adding nodes to it
        Node root = newNode(2);
        root.left = newNode(1);
        root.right = newNode(9);
        root.left.left =newNode(10);
        root.left.right = newNode(5);
      
        int K = 5;
      
        Console.WriteLine(findCount(root, K));   
    }
}
  
// This code is contributed by sapnasingh4991

Javascript

<script>
  
// JavaScript program to find the count of
// subtrees in a Binary Tree
// having XOR value K
 
// A binary tree node
class Node
{
    constructor()
    {
        this.data = 0;
        this.left = null;
        this.right = null;
    }
};
 
var res = 0;
var k = 0;
 
// A utility function to
// allocate a new node
function newNode(data)
{
    var newNode = new Node();
    newNode.data = data;
    newNode.left= null;
    newNode.right = null;
    return newNode;
}
  
function rec(root)
{
    // Base Case:
    // If node is null, return 0
    if (root == null) {
        return 0;
    }
  
    // Calculating the XOR
    // of the current subtree
    var xr = (root.data);//^rec(root.left)^rec(root.right);
    xr ^= rec(root.left);
    xr ^= rec(root.right);
      
    // Increment res
    // if xr is equal to k
    if (xr == k) {
        res++;
    }
  
    // Return the XOR value
    // of the current subtree
    return xr;
}
  
// Function to find the required count
function findCount(root, K)
{
    // Initialize result variable 'res'
    res = 0;
    k = K;
 
    // Recursively traverse the tree
    // and compute the count
    rec(root);
 
    // return the count 'res'
    return res;
}
  
// Driver program
/*
    2
/ \
1 9
/ \
10 5
*/
 
// Create the binary tree
// by adding nodes to it
var root = newNode(2);
root.left = newNode(1);
root.right = newNode(9);
root.left.left =newNode(10);
root.left.right = newNode(5);
 
var K = 5;
 
document.write(findCount(root, K));   
 
 
</script>
Producción: 

2

 

Análisis de rendimiento:
Complejidad de tiempo : como en el enfoque anterior, estamos iterando sobre cada Node solo una vez, por lo tanto, tomará O (N) tiempo donde N es el número de Nodes en el árbol binario.
Complejidad del espacio auxiliar : como en el enfoque anterior, no se utiliza espacio adicional, por lo tanto, la complejidad del espacio auxiliar será O(1) .
 

Publicación traducida automáticamente

Artículo escrito por mehul_02 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *