Nyomtassa ki a bináris fa minden szintjének extrém csomópontjait váltakozó sorrendben

Nyomtassa ki a bináris fa minden szintjének extrém csomópontjait váltakozó sorrendben
Próbáld ki a GfG Practice-n Nyomtassa ki a bináris fa minden szintjének extrém csomópontjait váltakozó sorrendben #practiceLinkDiv { display: none !important; }

Adott egy bináris fa nyomtatási csomópontok az egyes szintek szélső sarkaiból, de váltakozó sorrendben.
Példa: 
 

For above tree the output can be   1 2 7 8 31    - print rightmost node of 1st level  - print leftmost node of 2nd level  - print rightmost node of 3rd level  - print leftmost node of 4th level  - print rightmost node of 5th level OR   1 3 4 15 16    - print leftmost node of 1st level  - print rightmost node of 2nd level  - print leftmost node of 3rd level  - print rightmost node of 4th level  - print leftmost node of 5th level 
Recommended Practice Extrém csomópontok váltakozó sorrendben Próbáld ki!

Az ötlet az, hogy a fán szintről szintre haladjunk. Minden szinten megszámoljuk a benne lévő csomópontok számát, és kiírjuk a bal szélső vagy a jobb szélső csomópontot egy logikai zászló értéke alapján. Szintváltáskor sorba állítjuk az aktuális szintű összes csomópontot, és sorba állítjuk a következő szintű összes csomópontot, és megfordítjuk a logikai jelző értékét.



Alább látható a fenti ötlet megvalósítása - 

C++
   /* C++ program to print nodes of extreme corners   of each level in alternate order */   #include          using     namespace     std  ;   /* A binary tree node has data pointer to left child   and a pointer to right child */   struct     Node   {      int     data  ;      Node     *  left       *  right  ;   };   /* Helper function that allocates a new node with the   given data and NULL left and right pointers. */   Node  *     newNode  (  int     data  )   {      Node  *     node     =     new     Node  ;      node  ->  data     =     data  ;      node  ->  right     =     node  ->  left     =     NULL  ;      return     node  ;   }   /* Function to print nodes of extreme corners   of each level in alternate order */   void     printExtremeNodes  (  Node  *     root  )   {      if     (  root     ==     NULL  )      return  ;      // Create a queue and enqueue left and right      // children of root      queue   <  Node  *>     q  ;      q  .  push  (  root  );      // flag to indicate whether leftmost node or      // the rightmost node has to be printed      bool     flag     =     false  ;      while     (  !  q  .  empty  ())      {      // nodeCount indicates number of nodes      // at current level.      int     nodeCount     =     q  .  size  ();      int     n     =     nodeCount  ;      // Dequeue all nodes of current level      // and Enqueue all nodes of next level      while     (  n  --  )      {      Node  *     curr     =     q  .  front  ();      // Enqueue left child      if     (  curr  ->  left  )      q  .  push  (  curr  ->  left  );      // Enqueue right child      if     (  curr  ->  right  )      q  .  push  (  curr  ->  right  );      // Dequeue node      q  .  pop  ();      // if flag is true print leftmost node      if     (  flag     &&     n     ==     nodeCount     -     1  )      cout      < <     curr  ->  data      < <     ' '  ;      // if flag is false print rightmost node      if     (  !  flag     &&     n     ==     0  )      cout      < <     curr  ->  data      < <     ' '  ;      }      // invert flag for next level      flag     =     !  flag  ;      }   }   /* Driver program to test above functions */   int     main  ()   {      // Binary Tree of Height 4      Node  *     root     =     newNode  (  1  );      root  ->  left     =     newNode  (  2  );      root  ->  right     =     newNode  (  3  );      root  ->  left  ->  left     =     newNode  (  4  );      root  ->  left  ->  right     =     newNode  (  5  );      root  ->  right  ->  right     =     newNode  (  7  );      root  ->  left  ->  left  ->  left     =     newNode  (  8  );      root  ->  left  ->  left  ->  right     =     newNode  (  9  );      root  ->  left  ->  right  ->  left     =     newNode  (  10  );      root  ->  left  ->  right  ->  right     =     newNode  (  11  );      root  ->  right  ->  right  ->  left     =     newNode  (  14  );      root  ->  right  ->  right  ->  right     =     newNode  (  15  );      root  ->  left  ->  left  ->  left  ->  left     =     newNode  (  16  );      root  ->  left  ->  left  ->  left  ->  right     =     newNode  (  17  );      root  ->  right  ->  right  ->  right  ->  right     =     newNode  (  31  );      printExtremeNodes  (  root  );      return     0  ;   }   
Java
   // Java program to print nodes of extreme corners    //of each level in alternate order    import     java.util.*  ;   class   GFG   {       // A binary tree node has data pointer to left child    //and a pointer to right child /   static     class   Node      {         int     data  ;         Node     left       right  ;      };      // Helper function that allocates a new node with the    //given data and null left and right pointers. /   static     Node     newNode  (  int     data  )      {         Node     node     =     new     Node  ();         node  .  data     =     data  ;         node  .  right     =     node  .  left     =     null  ;         return     node  ;      }      // Function to print nodes of extreme corners    //of each level in alternate order    static     void     printExtremeNodes  (  Node     root  )      {         if     (  root     ==     null  )         return  ;         // Create a queue and enqueue left and right       // children of root       Queue   <  Node  >     q     =     new     LinkedList   <  Node  >  ();         q  .  add  (  root  );         // flag to indicate whether leftmost node or       // the rightmost node has to be printed       boolean     flag     =     false  ;         while     (  q  .  size  ()  >  0  )         {         // nodeCount indicates number of nodes       // at current level.       int     nodeCount     =     q  .  size  ();         int     n     =     nodeCount  ;         // Dequeue all nodes of current level       // and Enqueue all nodes of next level       while     (  n  -->  0  )         {         Node     curr     =     q  .  peek  ();         // Enqueue left child       if     (  curr  .  left  !=  null  )         q  .  add  (  curr  .  left  );         // Enqueue right child       if     (  curr  .  right  !=  null  )         q  .  add  (  curr  .  right  );         // Dequeue node       q  .  remove  ();         // if flag is true print leftmost node       if     (  flag     &&     n     ==     nodeCount     -     1  )         System  .  out  .  print  (     curr  .  data     +     ' '  );      // if flag is false print rightmost node       if     (  !  flag     &&     n     ==     0  )         System  .  out  .  print  (     curr  .  data     +     ' '  );         }             // invert flag for next level       flag     =     !  flag  ;         }      }      // Driver code   public     static     void     main  (  String     args  []  )   {         // Binary Tree of Height 4       Node     root     =     newNode  (  1  );         root  .  left     =     newNode  (  2  );         root  .  right     =     newNode  (  3  );         root  .  left  .  left     =     newNode  (  4  );         root  .  left  .  right     =     newNode  (  5  );         root  .  right  .  right     =     newNode  (  7  );         root  .  left  .  left  .  left     =     newNode  (  8  );         root  .  left  .  left  .  right     =     newNode  (  9  );         root  .  left  .  right  .  left     =     newNode  (  10  );         root  .  left  .  right  .  right     =     newNode  (  11  );         root  .  right  .  right  .  left     =     newNode  (  14  );         root  .  right  .  right  .  right     =     newNode  (  15  );         root  .  left  .  left  .  left  .  left     =     newNode  (  16  );         root  .  left  .  left  .  left  .  right     =     newNode  (  17  );         root  .  right  .  right  .  right  .  right     =     newNode  (  31  );         printExtremeNodes  (  root  );      }   }      // This code is contributed by Arnab Kundu   
Python
   # Python program to print nodes of extreme corners   # of each level in alternate order   # Utility class to create a node    class   Node  :   def   __init__  (  self     key  ):   self  .  data   =   key   self  .  left   =   self  .  right   =   None   # Utility function to create a tree node   def   newNode  (   data  ):   temp   =   Node  (  0  )   temp  .  data   =   data   temp  .  left   =   temp  .  right   =   None   return   temp   # Function to print nodes of extreme corners   # of each level in alternate order    def   printExtremeNodes  (   root  ):   if   (  root   ==   None  ):   return   # Create a queue and enqueue left and right   # children of root   q   =   []   q  .  append  (  root  )   # flag to indicate whether leftmost node or   # the rightmost node has to be printed   flag   =   False   while   (  len  (  q  )   >   0  ):   # nodeCount indicates number of nodes   # at current level.   nodeCount   =   len  (  q  )   n   =   nodeCount   # Dequeue all nodes of current level   # and Enqueue all nodes of next level   while   (  n   >   0  ):   n   =   n   -   1   curr   =   q  [  0  ]   # Enqueue left child   if   (  curr  .  left   !=   None  ):   q  .  append  (  curr  .  left  )   # Enqueue right child   if   (  curr  .  right   !=   None  ):   q  .  append  (  curr  .  right  )   # Dequeue node   q  .  pop  (  0  )   # if flag is true print leftmost node   if   (  flag   and   n   ==   nodeCount   -   1  ):   print  (   curr  .  data      end  =  ' '  )   # if flag is false print rightmost node   if   (  not   flag   and   n   ==   0  ):   print  (   curr  .  data     end  =   ' '  )   # invert flag for next level   flag   =   not   flag   # Driver program to test above functions    # Binary Tree of Height 4   root   =   newNode  (  1  )   root  .  left   =   newNode  (  2  )   root  .  right   =   newNode  (  3  )   root  .  left  .  left   =   newNode  (  4  )   root  .  left  .  right   =   newNode  (  5  )   root  .  right  .  right   =   newNode  (  7  )   root  .  left  .  left  .  left   =   newNode  (  8  )   root  .  left  .  left  .  right   =   newNode  (  9  )   root  .  left  .  right  .  left   =   newNode  (  10  )   root  .  left  .  right  .  right   =   newNode  (  11  )   root  .  right  .  right  .  left   =   newNode  (  14  )   root  .  right  .  right  .  right   =   newNode  (  15  )   root  .  left  .  left  .  left  .  left   =   newNode  (  16  )   root  .  left  .  left  .  left  .  right   =   newNode  (  17  )   root  .  right  .  right  .  right  .  right   =   newNode  (  31  )   printExtremeNodes  (  root  )   # This code is contributed by Arnab Kundu   
C#
   // C# program to print nodes of extreme corners    //of each level in alternate order    using     System  ;   using     System.Collections.Generic  ;   class     GFG   {       // 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  ;      };      // Helper function that allocates a new node with the    //given data and null left and right pointers. /   static     Node     newNode  (  int     data  )      {         Node     node     =     new     Node  ();         node  .  data     =     data  ;         node  .  right     =     node  .  left     =     null  ;         return     node  ;      }      // Function to print nodes of extreme corners    //of each level in alternate order    static     void     printExtremeNodes  (  Node     root  )      {         if     (  root     ==     null  )         return  ;         // Create a queue and enqueue left and right       // children of root       Queue   <  Node  >     q     =     new     Queue   <  Node  >  ();         q  .  Enqueue  (  root  );         // flag to indicate whether leftmost node or       // the rightmost node has to be printed       Boolean     flag     =     false  ;         while     (  q  .  Count     >     0  )         {         // nodeCount indicates number of nodes       // at current level.       int     nodeCount     =     q  .  Count  ;         int     n     =     nodeCount  ;         // Dequeue all nodes of current level       // and Enqueue all nodes of next level       while     (  n  -->  0  )         {         Node     curr     =     q  .  Peek  ();         // Enqueue left child       if     (  curr  .  left     !=     null  )         q  .  Enqueue  (  curr  .  left  );         // Enqueue right child       if     (  curr  .  right     !=     null  )         q  .  Enqueue  (  curr  .  right  );         // Dequeue node       q  .  Dequeue  ();         // if flag is true print leftmost node       if     (  flag     &&     n     ==     nodeCount     -     1  )         Console  .  Write  (     curr  .  data     +     ' '  );      // if flag is false print rightmost node       if     (  !  flag     &&     n     ==     0  )         Console  .  Write  (     curr  .  data     +     ' '  );         }             // invert flag for next level       flag     =     !  flag  ;         }      }      // Driver code   public     static     void     Main  (  String     []  args  )   {         // Binary Tree of Height 4       Node     root     =     newNode  (  1  );         root  .  left     =     newNode  (  2  );         root  .  right     =     newNode  (  3  );         root  .  left  .  left     =     newNode  (  4  );         root  .  left  .  right     =     newNode  (  5  );         root  .  right  .  right     =     newNode  (  7  );         root  .  left  .  left  .  left     =     newNode  (  8  );         root  .  left  .  left  .  right     =     newNode  (  9  );         root  .  left  .  right  .  left     =     newNode  (  10  );         root  .  left  .  right  .  right     =     newNode  (  11  );         root  .  right  .  right  .  left     =     newNode  (  14  );         root  .  right  .  right  .  right     =     newNode  (  15  );         root  .  left  .  left  .  left  .  left     =     newNode  (  16  );         root  .  left  .  left  .  left  .  right     =     newNode  (  17  );         root  .  right  .  right  .  right  .  right     =     newNode  (  31  );         printExtremeNodes  (  root  );      }   }   // This code is contributed by Rajput-Ji   
JavaScript
    <  script  >       // JavaScript program to print nodes of extreme corners    //of each level in alternate order        // A binary tree node has data pointer to left child    //and a pointer to right child /   class     Node      {         constructor  ()      {      this  .  data     =     0  ;      this  .  left     =     null  ;      this  .  right     =     null  ;      }   };      // Helper function that allocates a new node with the    //given data and null left and right pointers. /   function     newNode  (  data  )      {         var     node     =     new     Node  ();         node  .  data     =     data  ;         node  .  right     =     node  .  left     =     null  ;         return     node  ;      }      // Function to print nodes of extreme corners    //of each level in alternate order    function     printExtremeNodes  (  root  )      {         if     (  root     ==     null  )         return  ;         // Create a queue and enqueue left and right       // children of root       var     q     =     [];         q  .  push  (  root  );         // flag to indicate whether leftmost node or       // the rightmost node has to be printed       var     flag     =     false  ;         while     (  q  .  length     >     0  )         {         // nodeCount indicates number of nodes       // at current level.       var     nodeCount     =     q  .  length  ;         var     n     =     nodeCount  ;         // Dequeue all nodes of current level       // and push all nodes of next level       while     (  n  -->  0  )         {         var     curr     =     q  [  0  ];         // push left child       if     (  curr  .  left     !=     null  )         q  .  push  (  curr  .  left  );         // push right child       if     (  curr  .  right     !=     null  )         q  .  push  (  curr  .  right  );         // Dequeue node       q  .  shift  ();         // if flag is true print leftmost node       if     (  flag     &&     n     ==     nodeCount     -     1  )         document  .  write  (     curr  .  data     +     ' '  );      // if flag is false print rightmost node       if     (  !  flag     &&     n     ==     0  )         document  .  write  (     curr  .  data     +     ' '  );         }             // invert flag for next level       flag     =     !  flag  ;         }      }      // Driver code   // Binary Tree of Height 4    var     root     =     newNode  (  1  );      root  .  left     =     newNode  (  2  );      root  .  right     =     newNode  (  3  );      root  .  left  .  left     =     newNode  (  4  );      root  .  left  .  right     =     newNode  (  5  );      root  .  right  .  right     =     newNode  (  7  );      root  .  left  .  left  .  left     =     newNode  (  8  );      root  .  left  .  left  .  right     =     newNode  (  9  );      root  .  left  .  right  .  left     =     newNode  (  10  );      root  .  left  .  right  .  right     =     newNode  (  11  );      root  .  right  .  right  .  left     =     newNode  (  14  );      root  .  right  .  right  .  right     =     newNode  (  15  );      root  .  left  .  left  .  left  .  left     =     newNode  (  16  );      root  .  left  .  left  .  left  .  right     =     newNode  (  17  );      root  .  right  .  right  .  right  .  right     =     newNode  (  31  );      printExtremeNodes  (  root  );       <  /script>    

Kimenet
1 2 7 8 31  


Időbeli összetettség: O(n) ahol n az adott bináris fában lévő csomópontok teljes száma.
Kiegészítő tér: O(n) ahol n az adott bináris fában lévő csomópontok teljes száma a sor miatt.

gyakorlat - Nyomtassa ki az egyes szintek szélső sarkainak csomópontjait alulról felfelé, váltakozó sorrendben.

 


Top Cikkek

Kategória

Érdekes Cikkek