Рубрики

Чек для детей Сумма собственности в бинарном дереве

Для данного двоичного дерева напишите функцию, которая возвращает true, если дерево удовлетворяет указанному ниже свойству.

Для каждого узла значение данных должно быть равно сумме значений данных в левом и правом дочерних элементах. Рассмотрим значение данных как 0 для дочерних элементов NULL. Ниже дерево является примером

Алгоритм:
Пройдите данное двоичное дерево. Для каждого узла проверьте (рекурсивно), удовлетворяет ли узел и оба его дочерних элемента свойству Children Sum, если это так, то верните true, иначе верните false.

Реализация:

C ++

/ * Программа проверки имущества детей * /
#include <bits/stdc++.h>

using namespace std;

  
/ * У узла двоичного дерева есть данные, оставленные
ребенок и правый ребенок * /

struct node

{

    int data;

    struct node* left;

    struct node* right;

};

  
/ * возвращает 1, если свойство sum детей имеет место
для данного узла и обоих его дочерних элементов * /

int isSumProperty(struct node* node)

{

    / * left_data - оставленные дочерние данные и

       right_data для правых дочерних данных * /

    int left_data = 0, right_data = 0;

      

    / * Если узел NULL или это листовой узел

    затем верните true * /

    if(node == NULL ||

        (node->left == NULL && 

         node->right == NULL))

        return 1;

    else

    {

        / * Если левого ребенка нет, то 0

        используется в качестве данных левого ребенка * /

        if(node->left != NULL)

        left_data = node->left->data;

      

        / * Если нужного ребенка нет, то 0

        используется в качестве данных правого ребенка * /

        if(node->right != NULL)

        right_data = node->right->data;

      

        / * если узел и оба его потомка

        Удовлетворить возвращение собственности 1, иначе 0 * /

        if((node->data == left_data + right_data)&&

            isSumProperty(node->left) &&

            isSumProperty(node->right))

        return 1;

        else

        return 0;

    }

}

  
/ *
Вспомогательная функция, которая выделяет новый узел
с данными данными и NULL влево и вправо
указатели.
* /

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);

}

  
// Код драйвера

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;

}
// Этот код предоставлен Akanksha Rai

С

/ * Программа проверки имущества детей * /
#include <stdio.h>
#include <stdlib.h>

  
/ * Узел двоичного дерева имеет данные, левый и правый дочерние элементы * /

struct node

{

    int data;

    struct node* left;

    struct node* right;

};

  
/ * возвращает 1, если свойство суммы детей имеет место для заданного

    узел и оба его потомка * /

int isSumProperty(struct node* node)

{

  / * left_data это левые дочерние данные, а right_data для правых

     дочерние данные * /

  int left_data = 0,  right_data = 0;

  

  / * Если узел NULL или это листовой узел, то

     вернуть истину * /

  if(node == NULL ||

     (node->left == NULL && node->right == NULL))

    return 1;

  else

  {

    / * Если левого ребенка нет, то используется 0

       как данные левого ребенка * /

    if(node->left != NULL)

      left_data = node->left->data;

  

    / * Если нужного ребенка нет, то используется 0

      как данные правильного ребенка * /

    if(node->right != NULL)

      right_data = node->right->data;

  

    / * если узел и оба его потомка удовлетворяют

       возвращение свойства 1 еще 0 * /

    if((node->data == left_data + right_data)&&

        isSumProperty(node->left) &&

        isSumProperty(node->right))

      return 1;

    else

      return 0;

  }

}

  
/ *

 Вспомогательная функция, которая выделяет новый узел

 с данными данными и NULL влево и вправо

 указатели.

* /

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);

}

  
/ * Программа драйвера для проверки вышеуказанной функции * /

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-программа для проверки свойства sum детей

   
/ * Узел двоичного дерева содержит данные, указатель на левого потомка

   и указатель на правого ребенка * /

class Node 

{

    int data;

    Node left, right;

   

    public Node(int d) 

    {

        data = d;

        left = right = null;

    }

}

   

class BinaryTree 

{

    Node root;

   

    / * возвращает 1, если свойство суммы детей имеет место для заданного

    узел и оба его потомка * /

    int isSumProperty(Node node) 

    {

           

        / * left_data это левые дочерние данные, а right_data для правых

           дочерние данные * /

        int left_data = 0, right_data = 0;

   

        / * Если узел NULL или это листовой узел, то

        вернуть истину * /

        if (node == null

                || (node.left == null && node.right == null))

            return 1;

        else

        {

              

            / * Если левого ребенка нет, то используется 0

               как данные левого ребенка * /

            if (node.left != null

                left_data = node.left.data;

   

            / * Если нужного ребенка нет, то используется 0

               как данные правильного ребенка * /

            if (node.right != null

                right_data = node.right.data;

   

            / * если узел и оба его потомка удовлетворяют

               возвращение свойства 1 еще 0 * /

            if ((node.data == left_data + right_data)

                    && (isSumProperty(node.left)!=0)

                    && isSumProperty(node.right)!=0)

                return 1;

            else

                return 0;

        }

    }

      

    / * программа драйвера для проверки вышеуказанных функций * /

    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 программа для проверки детей
# сумма собственности

  
# Вспомогательный класс, который выделяет новый
# узел с заданными данными и None
# левый и правый указатели.

class newNode:

    def __init__(self, data):

        self.data = data 

        self.left = None

        self.right = None

  
# возвращает 1, если свойство sum детей
# держится для данного узла и обоих
# его детей

def isSumProperty(node):

          

    # left_data - оставленные дочерние данные и

    # right_data для правых дочерних данных

    left_data = 0

    right_data = 0

      

    # Если узел None или это лист

    # узел, тогда верните истину

    if(node == None or (node.left == None and 

                        node.right == None)): 

        return 1

    else:

          

        # Если левого ребенка нет, то

        # 0 используется как данные левого ребенка

        if(node.left != None):

            left_data = node.left.data 

      

        # Если правильного ребенка нет, то

        # 0 используется как данные правого ребенка

        if(node.right != None):

            right_data = node.right.data 

      

        # если узел и оба его потомка

        # удовлетворить свойство вернуть 1 еще 0

        if((node.data == left_data + right_data) and 

                        isSumProperty(node.left) and 

                        isSumProperty(node.right)):

            return 1

        else:

            return 0

  
Код водителя

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 ")

      
# Этот код предоставлен PranchalK

C #

// C # программа для проверки свойства суммы детей

using System;

  
/ * Узел двоичного дерева имеет данные, указатель
левый ребенок и указатель на правый ребенок * /

public class Node

{

    public int data;

    public Node left, right;

  

    public Node(int d)

    {

        data = d;

        left = right = null;

    }

}

  

class GFG

{

public Node root;

  
/ * возвращает 1, если свойство sum детей имеет место
для данного узла и обоих его дочерних элементов * /

public virtual int isSumProperty(Node node)

{

  

    / * left_data - оставленные дочерние данные и

    right_data для правых дочерних данных * /

    int left_data = 0, right_data = 0;

  

    / * Если узел NULL или это лист

    затем верните ноль * /

    if (node == null || (node.left == null && 

                         node.right == null))

    {

        return 1;

    }

    else

    {

  

        / * Если левого ребенка нет

        тогда 0 используется как данные левого потомка * /

        if (node.left != null)

        {

            left_data = node.left.data;

        }

  

        / * Если правильного ребенка нет, то

        0 используется как данные правого ребенка * /

        if (node.right != null)

        {

            right_data = node.right.data;

        }

  

        / * если узел и оба его потомка

        Удовлетворить возвращение собственности 1, иначе 0 * /

        if ((node.data == left_data + right_data) && 

                  (isSumProperty(node.left) != 0) && 

                   isSumProperty(node.right) != 0)

        {

            return 1;

        }

        else

        {

            return 0;

        }

    }

}

  
// Код драйвера

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");

    }

}
}

  
// Этот код предоставлен Shrikant13


Выход:

The given tree satisfies the children sum property 

Сложность времени: O (n), мы делаем полный обход дерева.

В качестве упражнения продлите вышеупомянутый вопрос для n-арного дерева.

Этот вопрос задал Шехар.

Пожалуйста, пишите комментарии, если вы обнаружите какую-либо ошибку в приведенном выше алгоритме или лучший способ решить ту же проблему.

Рекомендуемые посты:

Чек для детей Сумма собственности в бинарном дереве

0.00 (0%) 0 votes