Comprobar la propiedad de suma de niños en un árbol binario

Dado un árbol binario, escriba una función que devuelva verdadero si el árbol satisface la propiedad siguiente. 
Para cada Node, el valor de los datos debe ser igual a la suma de los valores de los datos en los hijos izquierdo y derecho. Considere el valor de los datos como 0 para niños NULL. El siguiente árbol es un ejemplo.
 

C++

/* Program to check children sum property */
#include <bits/stdc++.h>
using namespace std;
 
/* A binary tree node has data, left
child and right child */
struct node
{
    int data;
    struct node* left;
    struct node* right;
};
 
/* returns 1 if children sum property holds
for the given node and both of its children*/
int isSumProperty(struct node* node)
{
    /* left_data is left child data and
       right_data is for right child data*/
    int sum = 0;
     
    /* If node is NULL or it's a leaf node
    then return true */
    if(node == NULL ||
        (node->left == NULL &&
         node->right == NULL))
        return 1;
    else
    {
        /* If left child is not present then 0
        is used as data of left child */
        if(node->left != NULL)
        sum += node->left->data;
     
        /* If right child is not present then 0
        is used as data of right child */
        if(node->right != NULL)
        sum+ = node->right->data;
     
        /* if the node and both of its children
        satisfy the property return 1 else 0*/
        return ((node->data == sum)&&
            isSumProperty(node->left) &&
            isSumProperty(node->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 =
        (struct node*)malloc(sizeof(struct node));
    node->data = data;
    node->left = NULL;
    node->right = NULL;
    return(node);
}
 
// Driver Code
int main()
{
    struct node *root = newNode(10);
    root->left     = newNode(8);
    root->right = newNode(2);
    root->left->left = newNode(3);
    root->left->right = newNode(5);
    root->right->right = newNode(2);
    if(isSumProperty(root))
        cout << "The given tree satisfies "
            << "the children sum property ";
    else
        cout << "The given tree does not satisfy "
            << "the children sum property ";
 
    getchar();
    return 0;
}
// This code is contributed by Akanksha Rai

C

/* Program to check children sum property */
#include <stdio.h>
#include <stdlib.h>
 
/* A binary tree node has data, left child and right child */
struct node
{
    int data;
    struct node* left;
    struct node* right;
};
 
/* returns 1 if children sum property holds for the given
    node and both of its children*/
int isSumProperty(struct node* node)
{
  /* left_data is left child data and right_data is for right
     child data*/
  int left_data = 0,  right_data = 0;
 
  /* If node is NULL or it's a leaf node then
     return true */
  if(node == NULL ||
     (node->left == NULL && node->right == NULL))
    return 1;
  else
  {
    /* If left child is not present then 0 is used
       as data of left child */
    if(node->left != NULL)
      left_data = node->left->data;
 
    /* If right child is not present then 0 is used
      as data of right child */
    if(node->right != NULL)
      right_data = node->right->data;
 
    /* if the node and both of its children satisfy the
       property return 1 else 0*/
    if((node->data == left_data + right_data)&&
        isSumProperty(node->left) &&
        isSumProperty(node->right))
      return 1;
    else
      return 0;
  }
}
 
/*
 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 =
      (struct node*)malloc(sizeof(struct node));
  node->data = data;
  node->left = NULL;
  node->right = NULL;
  return(node);
}
 
/* Driver program to test above function */
int main()
{
  struct node *root  = newNode(10);
  root->left         = newNode(8);
  root->right        = newNode(2);
  root->left->left   = newNode(3);
  root->left->right  = newNode(5);
  root->right->right = newNode(2);
  if(isSumProperty(root))
    printf("The given tree satisfies the children sum property ");
  else
    printf("The given tree does not satisfy the children sum property ");
 
  getchar();
  return 0;
}

Java

// Java program to check children sum property
  
/* A binary tree node has data, pointer to left child
   and a pointer to right child */
class Node
{
    int data;
    Node left, right;
  
    public Node(int d)
    {
        data = d;
        left = right = null;
    }
}
  
class BinaryTree
{
    Node root;
  
    /* returns 1 if children sum property holds for the given
    node and both of its children*/
    int isSumProperty(Node node)
    {
          
        /* left_data is left child data and right_data is for right
           child data*/
        int left_data = 0, right_data = 0;
  
        /* If node is NULL or it's a leaf node then
        return true */
        if (node == null
                || (node.left == null && node.right == null))
            return 1;
        else
        {
             
            /* If left child is not present then 0 is used
               as data of left child */
            if (node.left != null)
                left_data = node.left.data;
  
            /* If right child is not present then 0 is used
               as data of right child */
            if (node.right != null)
                right_data = node.right.data;
  
            /* if the node and both of its children satisfy the
               property return 1 else 0*/
            if ((node.data == left_data + right_data)
                    && (isSumProperty(node.left)!=0)
                    && isSumProperty(node.right)!=0)
                return 1;
            else
                return 0;
        }
    }
     
    /* driver program to test the above functions */
    public static void main(String[] args)
    {
        BinaryTree tree = new BinaryTree();
        tree.root = new Node(10);
        tree.root.left = new Node(8);
        tree.root.right = new Node(2);
        tree.root.left.left = new Node(3);
        tree.root.left.right = new Node(5);
        tree.root.right.right = new Node(2);
        if (tree.isSumProperty(tree.root) != 0)
            System.out.println("The given tree satisfies children"
                    + " sum property");
        else
            System.out.println("The given tree does not satisfy children"
                    + " sum property");
    }
}

Python3

# Python3 program to check children
# sum property
 
# 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 = None
        self.right = None
 
# returns 1 if children sum property
# holds for the given node and both
# of its children
def isSumProperty(node):
         
    # left_data is left child data and
    # right_data is for right child data
    left_data = 0
    right_data = 0
     
    # If node is None or it's a leaf
    # node then return true
    if(node == None or (node.left == None and
                        node.right == None)):
        return 1
    else:
         
        # If left child is not present then
        # 0 is used as data of left child
        if(node.left != None):
            left_data = node.left.data
     
        # If right child is not present then
        # 0 is used as data of right child
        if(node.right != None):
            right_data = node.right.data
     
        # if the node and both of its children 
        # satisfy the property return 1 else 0
        if((node.data == left_data + right_data) and
                        isSumProperty(node.left) and
                        isSumProperty(node.right)):
            return 1
        else:
            return 0
 
# Driver Code
if __name__ == '__main__':
    root = newNode(10)
    root.left = newNode(8)
    root.right = newNode(2)
    root.left.left = newNode(3)
    root.left.right = newNode(5)
    root.right.right = newNode(2)
    if(isSumProperty(root)):
        print("The given tree satisfies the",
                    "children sum property ")
    else:
        print("The given tree does not satisfy",
                   "the children sum property ")
     
# This code is contributed by PranchalK

C#

// C# program to check children sum property
using System;
 
/* A binary tree node has data, pointer
to left child and a pointer to right child */
public class Node
{
    public int data;
    public Node left, right;
 
    public Node(int d)
    {
        data = d;
        left = right = null;
    }
}
 
class GFG
{
public Node root;
 
/* returns 1 if children sum property holds
for the given node and both of its children*/
public virtual int isSumProperty(Node node)
{
 
    /* left_data is left child data and
    right_data is for right child data*/
    int left_data = 0, right_data = 0;
 
    /* If node is NULL or it's a leaf
    node then return true */
    if (node == null || (node.left == null &&
                         node.right == null))
    {
        return 1;
    }
    else
    {
 
        /* If left child is not present
        then 0 is used as data of left child */
        if (node.left != null)
        {
            left_data = node.left.data;
        }
 
        /* If right child is not present then
        0 is used as data of right child */
        if (node.right != null)
        {
            right_data = node.right.data;
        }
 
        /* if the node and both of its children
        satisfy the property return 1 else 0*/
        if ((node.data == left_data + right_data) &&
                  (isSumProperty(node.left) != 0) &&
                   isSumProperty(node.right) != 0)
        {
            return 1;
        }
        else
        {
            return 0;
        }
    }
}
 
// Driver Code
public static void Main(string[] args)
{
    GFG tree = new GFG();
    tree.root = new Node(10);
    tree.root.left = new Node(8);
    tree.root.right = new Node(2);
    tree.root.left.left = new Node(3);
    tree.root.left.right = new Node(5);
    tree.root.right.right = new Node(2);
    if (tree.isSumProperty(tree.root) != 0)
    {
        Console.WriteLine("The given tree satisfies" +
                            " children sum property");
    }
    else
    {
        Console.WriteLine("The given tree does not" +
                   " satisfy children sum property");
    }
}
}
 
// This code is contributed by Shrikant13

Javascript

<script>
 
      // JavaScript program to check children sum property
     
    class Node
    {
        constructor(data) {
           this.left = null;
           this.right = null;
           this.data = data;
        }
    }
     
    let root;
    
    /* returns 1 if children sum property holds for the given
    node and both of its children*/
    function isSumProperty(node)
    {
            
        /* left_data is left child data and right_data is for right
           child data*/
        let left_data = 0, right_data = 0;
    
        /* If node is NULL or it's a leaf node then
        return true */
        if (node == null
                || (node.left == null && node.right == null))
            return 1;
        else
        {
               
            /* If left child is not present then 0 is used
               as data of left child */
            if (node.left != null)
                left_data = node.left.data;
    
            /* If right child is not present then 0 is used
               as data of right child */
            if (node.right != null)
                right_data = node.right.data;
    
            /* if the node and both of its children satisfy the
               property return 1 else 0*/
            if ((node.data == left_data + right_data)
                    && (isSumProperty(node.left)!=0)
                    && isSumProperty(node.right)!=0)
                return 1;
            else
                return 0;
        }
    }
     
    root = new Node(10);
    root.left = new Node(8);
    root.right = new Node(2);
    root.left.left = new Node(3);
    root.left.right = new Node(5);
    root.right.right = new Node(2);
    if (isSumProperty(root) != 0)
      document.write("The given tree satisfies the children"
                         + " sum property");
    else
      document.write("The given tree does not satisfy children"
                         + " sum property");
    
</script>

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 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 *