Conteo de 1 en cualquier ruta en un árbol binario

Dado un árbol binario de 0 y 1, la tarea es encontrar el número máximo de 1 en cualquier ruta del árbol. La ruta puede comenzar y terminar en cualquier Node del árbol.
Ejemplo

Input: 
       1
      / \
     0   1
    / \
   1   1
      / \
     1   0

Output: 4

Acercarse: 
 

  1. Se ha creado una función countUntil que devuelve el recuento máximo de 1 en cualquier ruta vertical debajo de ese Node.
  2. Esta ruta debe ser una ruta única y esta ruta debe incluir como máximo un elemento secundario del Node, así como también él mismo. es decir, countUntil devuelve el recuento máximo de 1 en el hijo izquierdo o derecho y también se incluye a sí mismo en el recuento si su valor es 1.
  3. Entonces, desde cualquier Node countUntil(node->left) + countUntil(node->right) + node-> value dará el número de 1 en la ruta que contiene el Node y su ruta izquierda y derecha y ningún ancestro del Node se considera.
  4. Tomar el máximo de todos los Nodes dará la respuesta requerida.

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

C++

// C++ implementation of the above approach
#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);
}
 
// This function updates overall count of 1 in 'res'
// And returns count 1s going through root.
int countUntil(Node* root, int& res)
{
    // Base Case
    if (root == NULL)
        return 0;
 
    // l and r store count of 1s going through left and
    // right child of root respectively
    int l = countUntil(root->left, res);
    int r = countUntil(root->right, res);
 
    // maxCount represents the count of 1s when the Node under
    // consideration is the root of the maxCount path and no
    // ancestors of the root are there in maxCount path
    int maxCount;
 
    // if the value at node is 1 then its
    // count will be considered
    // including the leftCount and the rightCount
    if (root->data == 1)
        maxCount = l + r + 1;
    else
        maxCount = l + r;
 
    // Store the Maximum Result.
    res = max(res, maxCount);
 
    // return max count in a single path.
    // This path must include at-most one child
    // of the root as well as itself
 
    // if the value at node is 1
    // then its count will be considered
    // including the maximum of leftCount or the rightCount
    if (root->data == 1)
        return max(l, r) + 1;
    else
        return max(l, r);
}
 
// Returns maximum count of 1 in any path
// in tree with given root
int findMaxCount(Node* root)
{
    // Initialize result
    int res = INT_MIN;
 
    // Compute and return result
    countUntil(root, res);
    return res;
}
 
// Driver program
int main(void)
{
    struct Node* root = newNode(1);
    root->left = newNode(0);
    root->right = newNode(1);
    root->left->left = newNode(1);
    root->left->right = newNode(1);
    root->left->right->left = newNode(1);
    root->left->right->right = newNode(0);
    cout << findMaxCount(root);
    return 0;
}

Java

// Java implementation of the above approach
class GFG
{
 
    // A binary tree node
    static class Node
    {
        int data;
        Node left, right;
    };
 
    static int res;
 
    // A utility function to allocate a new node
    static Node newNode(int data)
    {
        Node newNode = new Node();
        newNode.data = data;
        newNode.left = newNode.right = null;
        return (newNode);
    }
 
    // This function updates overall count of 1 in 'res'
    // And returns count 1s going through root.
    static int countUntil(Node root)
    {
        // Base Case
        if (root == null)
            return 0;
 
        // l and r store count of 1s going through left and
        // right child of root respectively
        int l = countUntil(root.left);
        int r = countUntil(root.right);
 
        // maxCount represents the count of 1s when the Node under
        // consideration is the root of the maxCount path and no
        // ancestors of the root are there in maxCount path
        int maxCount;
 
        // if the value at node is 1 then its
        // count will be considered
        // including the leftCount and the rightCount
        if (root.data == 1)
            maxCount = l + r + 1;
        else
            maxCount = l + r;
 
        // Store the Maximum Result.
        res = Math.max(res, maxCount);
 
        // return max count in a single path.
        // This path must include at-most one child
        // of the root as well as itself
 
        // if the value at node is 1
        // then its count will be considered
        // including the maximum of leftCount or the rightCount
        if (root.data == 1)
            return Math.max(l, r) + 1;
        else
            return Math.max(l, r);
    }
 
    // Returns maximum count of 1 in any path
    // in tree with given root
    static int findMaxCount(Node root)
    {
        // Initialize result
        res = Integer.MIN_VALUE;
 
        // Compute and return result
        countUntil(root);
        return res;
    }
 
    // Driver program
    public static void main(String[] args)
    {
        Node root = newNode(1);
        root.left = newNode(0);
        root.right = newNode(1);
        root.left.left = newNode(1);
        root.left.right = newNode(1);
        root.left.right.left = newNode(1);
        root.left.right.right = newNode(0);
        System.out.print(findMaxCount(root));
    }
}
 
// This code is contributed by 29AjayKumar

Python3

# Python implementation of the above approach
 
# A binary tree node
class Node:
    def __init__(self):
        self.data = 0
        self.left = None
        self.right = None
 
# A utility function to allocate a new node
def newNode(data):
 
    newNode = Node()
    newNode.data = data
    newNode.left = newNode.right = None
    return (newNode)
 
res = 0
 
# This function updates overall count of 1 in 'res'
# And returns count 1s going through root.
def countUntil( root):
    global res
     
    # Base Case
    if (root == None):
        return 0
 
    # l and r store count of 1s going through left and
    # right child of root respectively
    l = countUntil(root.left)
    r = countUntil(root.right)
 
    # maxCount represents the count of 1s when the Node under
    # consideration is the root of the maxCount path and no
    # ancestors of the root are there in maxCount path
    maxCount = 0
 
    # if the value at node is 1 then its
    # count will be considered
    # including the leftCount and the rightCount
    if (root.data == 1):
        maxCount = l + r + 1
    else:
        maxCount = l + r
 
    # Store the Maximum Result.
    res = max(res, maxCount)
 
    # return max count in a single path.
    # This path must include at-most one child
    # of the root as well as itself
 
    # if the value at node is 1
    # then its count will be considered
    # including the maximum of leftCount or the rightCount
    if (root.data == 1):
        return max(l, r) + 1
    else:
        return max(l, r)
 
# Returns maximum count of 1 in any path
# in tree with given root
def findMaxCount(root):
     
    global res
 
    # Initialize result
    res = -999999
 
    # Compute and return result
    countUntil(root)
    return res
 
# Driver program
 
root = newNode(1)
root.left = newNode(0)
root.right = newNode(1)
root.left.left = newNode(1)
root.left.right = newNode(1)
root.left.right.left = newNode(1)
root.left.right.right = newNode(0)
print(findMaxCount(root))
 
# This code is contributed by Arnab Kundu

C#

     
// C# implementation of the above approach
using System;
 
class GFG
{
 
    // A binary tree node
    class Node
    {
        public int data;
        public Node left, right;
    };
 
    static int res;
 
    // A utility function to allocate a new node
    static Node newNode(int data)
    {
        Node newNode = new Node();
        newNode.data = data;
        newNode.left = newNode.right = null;
        return (newNode);
    }
 
    // This function updates overall count of 1 in 'res'
    // And returns count 1s going through root.
    static int countUntil(Node root)
    {
        // Base Case
        if (root == null)
            return 0;
 
        // l and r store count of 1s going through left and
        // right child of root respectively
        int l = countUntil(root.left);
        int r = countUntil(root.right);
 
        // maxCount represents the count of 1s when the Node under
        // consideration is the root of the maxCount path and no
        // ancestors of the root are there in maxCount path
        int maxCount;
 
        // if the value at node is 1 then its
        // count will be considered
        // including the leftCount and the rightCount
        if (root.data == 1)
            maxCount = l + r + 1;
        else
            maxCount = l + r;
 
        // Store the Maximum Result.
        res = Math.Max(res, maxCount);
 
        // return max count in a single path.
        // This path must include at-most one child
        // of the root as well as itself
 
        // if the value at node is 1
        // then its count will be considered
        // including the maximum of leftCount or the rightCount
        if (root.data == 1)
            return Math.Max(l, r) + 1;
        else
            return Math.Max(l, r);
    }
 
    // Returns maximum count of 1 in any path
    // in tree with given root
    static int findMaxCount(Node root)
    {
        // Initialize result
        res = int.MinValue;
 
        // Compute and return result
        countUntil(root);
        return res;
    }
 
    // Driver program
    public static void Main(String[] args)
    {
        Node root = newNode(1);
        root.left = newNode(0);
        root.right = newNode(1);
        root.left.left = newNode(1);
        root.left.right = newNode(1);
        root.left.right.left = newNode(1);
        root.left.right.right = newNode(0);
        Console.Write(findMaxCount(root));
    }
}
 
// This code is contributed by PrinciRaj1992

Javascript

<script>
 
// JavaScript implementation of the above approach
// A binary tree node
class Node
{
    constructor()
    {
        this.left = null;
        this.data = 0;
        this.right = null;
    }
};
var res = 0;
// A utility function to allocate a new node
function newNode(data)
{
    var newNode = new Node();
    newNode.data = data;
    newNode.left = newNode.right = null;
    return (newNode);
}
// This function updates overall count of 1 in 'res'
// And returns count 1s going through root.
function countUntil(root)
{
    // Base Case
    if (root == null)
        return 0;
    // l and r store count of 1s going through left and
    // right child of root respectively
    var l = countUntil(root.left);
    var r = countUntil(root.right);
    // maxCount represents the count of 1s when the Node under
    // consideration is the root of the maxCount path and no
    // ancestors of the root are there in maxCount path
    var maxCount;
    // if the value at node is 1 then its
    // count will be considered
    // including the leftCount and the rightCount
    if (root.data == 1)
        maxCount = l + r + 1;
    else
        maxCount = l + r;
    // Store the Maximum Result.
    res = Math.max(res, maxCount);
    // return max count in a single path.
    // This path must include at-most one child
    // of the root as well as itself
    // if the value at node is 1
    // then its count will be considered
    // including the maximum of leftCount or the rightCount
    if (root.data == 1)
        return Math.max(l, r) + 1;
    else
        return Math.max(l, r);
}
// Returns maximum count of 1 in any path
// in tree with given root
function findMaxCount(root)
{
    // Initialize result
    res = -1000000000;
    // Compute and return result
    countUntil(root);
    return res;
}
// Driver program
var root = newNode(1);
root.left = newNode(0);
root.right = newNode(1);
root.left.left = newNode(1);
root.left.right = newNode(1);
root.left.right.left = newNode(1);
root.left.right.right = newNode(0);
document.write(findMaxCount(root));
 
 
</script>
Producción: 

4

 

Complejidad de tiempo: O(n) 
donde n es el número de Nodes en el árbol binario.
 

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 *