Рубрики

Для данного двоичного дерева выведите все его пути от корня к листу по одному на строку.

Учитывая корни дерева. распечатайте все пути от корня к листу по одному на строку.

Алгоритм:

initialize: pathlen = 0, path[1000] 
/*1000 is some max limit for paths, it can change*/

/*printPathsRecur traverses nodes of tree in preorder */
printPathsRecur(tree, path[], pathlen)
   1) If node is not NULL then 
         a) push data to path array: 
                path[pathlen] = node->data.
         b) increment pathlen 
                pathlen++
   2) If node is a leaf node then print the path array.
   3) Else
        a) Call printPathsRecur for left subtree
                 printPathsRecur(node->left, path, pathLen)
        b) Call printPathsRecur for right subtree.
                printPathsRecur(node->right, path, pathLen)

Пример:

Пример дерева

Выход для приведенного выше примера будет

  1 2 4
  1 2 5
  1 3 

Реализация:

C ++

/ * C ++ программа для печати всех своих
пути от корня к листу для дерева * /
#include <bits/stdc++.h>

using namespace std; 

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

class node 

    public:

    int data; 

    node* left; 

    node* right; 

}; 

  

void printArray(int [], int); 

void printPathsRecur(node*, int [], int); 

node* newNode(int ); 

void printPaths(node*); 

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

void printPaths(node* node) 

    int path[1000]; 

    printPathsRecur(node, path, 0); 

  
/ * Рекурсивная вспомогательная функция - дано
узел и массив, содержащий
путь от корневого узла до, но не
включая этот узел, распечатайте все
корневые пути. * /

void printPathsRecur(node* node, int path[], int pathLen) 

    if (node == NULL) return

      

    / * добавить этот узел к массиву путей * /

    path[pathLen] = node->data; 

    pathLen++; 

      

    / * это лист, поэтому выведите путь, который привёл сюда * /

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

    

        printArray(path, pathLen); 

    

    else

    

    / * в противном случае попробуйте оба поддерева * /

        printPathsRecur(node->left, path, pathLen); 

        printPathsRecur(node->right, path, pathLen); 

    

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

node* newNode(int data) 

    node* Node = new node();

    Node->data = data; 

    Node->left = NULL; 

    Node->right = NULL; 

      

    return(Node); 

  
/ * Утилита, которая печатает массив в строке * /

void printArray(int ints[], int len) 

    int i; 

    for (i = 0; i < len; i++)

    

        cout << ints[i] << " "

    

    cout << endl; 

  
/ * Код водителя * /

int main() 

    node *root = newNode(1); 

    root->left = newNode(2); 

    root->right = newNode(3); 

    root->left->left = newNode(4); 

    root->left->right = newNode(5); 

      

    / * Распечатать все от корня до листа

    пути входного дерева * /

    printPaths(root); 

    return 0; 

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

С

/ * программа для печати всех путей от корня к листу для дерева * /
#include <stdio.h>
#include <stdlib.h>

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

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

struct node

{

    int data;

    struct node* left;

    struct node* right;

};

  

void printArray(int [], int);

void printPathsRecur(struct node*, int [], int);

struct node* newNode(int );

void printPaths(struct node*);

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

   пути, по одному на строку. Для выполнения работы используется рекурсивный помощник. * /   

void printPaths(struct node* node) 

{

  int path[1000];

  printPathsRecur(node, path, 0);

}

  
/ * Рекурсивная вспомогательная функция - заданный узел и массив, содержащий

 путь от корневого узла до этого узла, но не включая его,

 распечатать все пути корневых листьев. * /

void printPathsRecur(struct node* node, int path[], int pathLen) 

{

  if (node==NULL) return;

  

  / * добавить этот узел к массиву путей * /

  path[pathLen] = node->data;

  pathLen++;

  

  / * это лист, поэтому выведите путь, который привёл сюда * /

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

  {

    printArray(path, pathLen);

  }

  else 

  {

  / * в противном случае попробуйте оба поддерева * /

    printPathsRecur(node->left, path, pathLen);

    printPathsRecur(node->right, path, pathLen);

  }

}

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

   данные даны и 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);

}

  
/ * Утилита, которая печатает массив в строке * /

void printArray(int ints[], int len)

{

  int i;

  for (i=0; i<len; i++) {

    printf("%d ", ints[i]);

  }

  printf("\n");

  
/ * Программа драйвера для проверки зеркала () * /

int main()

{

  struct node *root = newNode(1);

  root->left        = newNode(2);

  root->right       = newNode(3);

  root->left->left  = newNode(4);

  root->left->right = newNode(5); 

  

  / * Вывести все корневые пути дерева ввода * /

  printPaths(root);

  

  getchar();

  return 0;

}

Джава

// Java-программа для печати всех корневых путей

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

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

class Node 

{

    int data;

    Node left, right;

   

    Node(int item) 

    {

        data = item;

        left = right = null;

    }

}

   

class BinaryTree 

{

     Node root;

       

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

       пути, по одному на строку. Для выполнения работы используется рекурсивный помощник. * /

    void printPaths(Node node) 

    {

        int path[] = new int[1000];

        printPathsRecur(node, path, 0);

    }

   

    / * Рекурсивная вспомогательная функция - заданный узел и массив, содержащий

       путь от корневого узла до этого узла, но не включая его,

       распечатать все пути корневых листьев. * /

    void printPathsRecur(Node node, int path[], int pathLen) 

    {

        if (node == null)

            return;

   

        / * добавить этот узел к массиву путей * /

        path[pathLen] = node.data;

        pathLen++;

   

        / * это лист, поэтому выведите путь, который привёл сюда * /

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

            printArray(path, pathLen);

        else

            

            / * в противном случае попробуйте оба поддерева * /

            printPathsRecur(node.left, path, pathLen);

            printPathsRecur(node.right, path, pathLen);

        }

    }

   

    / * Утилита, которая печатает массив в строке * /

    void printArray(int ints[], int len) 

    {

        int i;

        for (i = 0; i < len; i++) 

            System.out.print(ints[i] + " ");

        System.out.println("");

    }

   

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

    public static void main(String[] args) 

    {

        BinaryTree tree = new BinaryTree();

   

        tree.root = new Node(1);

        tree.root.left = new Node(2);

        tree.root.right = new Node(3);

        tree.root.left.left = new Node(4);

        tree.root.left.right = new Node(5);

   

        / * Вывести все корневые пути дерева ввода * /

        tree.printPaths(tree.root);

   

    }

}

python3

# Python3 программа для печати всех своих
# корневые пути для дерева

class Node:

      

    # Узел двоичного дерева содержит данные,

    # указатель на левого ребенка и

    # указатель на правого ребенка

    def __init__(self, data):

        self.data = data

        self.right = None

        self.left = None

  

def printRoute(stack, root):

    if root == None:

        return

          

    # добавить этот узел в массив пути

    stack.append(root.data)

    if(root.left == None and root.right == None):

          

        # распечатать все его

        # корень к листу

        print(' '.join([str(i) for i in stack]))

          

    # в противном случае попробуйте оба поддерева

    printRoute(stack, root.left)

    printRoute(stack, root.right)

    stack.pop()

  
Код водителя

root = Node(1);

root.left = Node(2);

root.right = Node(3);

root.left.left = Node(4);

root.left.right = Node(5);

printRoute([], root)

  
# Этот код добавлен
# Фархин Нилофер

C #

using System;

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

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

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

public class Node

{

    public int data;

    public Node left, right;

  

    public Node(int item)

    {

        data = item;

        left = right = null;

    }

}

  

public class BinaryTree

{

     public Node root;

  

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

       пути, по одному на строку. Для выполнения работы используется рекурсивный помощник. * /

    public virtual void printPaths(Node node)

    {

        int[] path = new int[1000];

        printPathsRecur(node, path, 0);

    }

  

    / * Рекурсивная вспомогательная функция - заданный узел и массив, содержащий

       путь от корневого узла до этого узла, но не включая его,

       распечатать все пути корневых листьев. * /

    public virtual void printPathsRecur(Node node, int[] path, int pathLen)

    {

        if (node == null)

        {

            return;

        }

  

        / * добавить этот узел к массиву путей * /

        path[pathLen] = node.data;

        pathLen++;

  

        / * это лист, поэтому выведите путь, который привёл сюда * /

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

        {

            printArray(path, pathLen);

        }

        else

        {

            / * в противном случае попробуйте оба поддерева * /

            printPathsRecur(node.left, path, pathLen);

            printPathsRecur(node.right, path, pathLen);

        }

    }

  

    / * Утилита, которая печатает массив в строке * /

    public virtual void printArray(int[] ints, int len)

    {

        int i;

        for (i = 0; i < len; i++)

        {

            Console.Write(ints[i] + " ");

        }

        Console.WriteLine("");

    }

  

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

    public static void Main(string[] args)

    {

        BinaryTree tree = new BinaryTree();

  

        tree.root = new Node(1);

        tree.root.left = new Node(2);

        tree.root.right = new Node(3);

        tree.root.left.left = new Node(4);

        tree.root.left.right = new Node(5);

  

        / * Вывести все корневые пути дерева ввода * /

        tree.printPaths(tree.root);

  

    }

}

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

Выход:

1 2 4
1 2 5
1 3

Ссылки:
http://cslibrary.stanford.edu/110/BinaryTrees.html

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

Для данного двоичного дерева выведите все его пути от корня к листу по одному на строку.

0.00 (0%) 0 votes