Maximaal element tussen twee knooppunten van BST

Maximaal element tussen twee knooppunten van BST

Gegeven een array van N elementen en twee gehele getallen een b die tot de gegeven array behoren. Maak een Binaire zoekboom door elementen in te voegen uit arr[0] tot arr[n-1] . De taak is om de maximaal element in het pad van a naar b.

Voorbeeld:

Invoer: arr[] = { 18 36 9 6 12 10 1 8 } a = 1 b = 10.
Uitgang: 12

Maximaal-element-tussen-twee-knooppunten-van-BST

Uitleg: Pad van 1 tot 10 bevat { 1 6 9 12 10 } . Het maximale element is 12.

Inhoudsopgave

[Naïeve aanpak] Hashen gebruiken - O(n * log n) Tijd en O(n) Ruimte

Het idee is om gebruik te maken van een hashmap om de op te slaan ouder knooppunt van elk knooppunt in de binaire zoekboom . We kunnen beginnen bij beide gegeven knooppunten en de boom doorkruisen, waarbij we de knooppunten opslaan die we tegenkomen in a set . Zodra we de wortel of een gemeenschappelijke voorouder van de twee knooppunten hebben bereikt, kunnen we vanaf elk knooppunt de boom doorkruisen en de maximaal element dat voorkomt in de reeks knooppunten.

Algoritmestappen voor de bovenstaande aanpak:

  • Maak een leeg hash-tabel om de op te slaan ouder knooppunt van elk knooppunt in de binaire zoekboom.
  • Voer een uit diepte-eerst zoeken (DFS) doorloop de binaire zoekboom en vul de hashtabel met het bovenliggende knooppunt van elk knooppunt.
  • Initialiseer twee wijzers, zeg p1 en p2 naar de gegeven knooppunten.
  • Initialiseer bijvoorbeeld twee lege sets s1 en s2 om de knooppunten op te slaan die u tegenkomt tijdens het doorkruisen van de boom p1 en p2 respectievelijk.
  • Terwijl p1 en p2 Zijn niet gelijk doe het volgende:
    • Als p1 dat niet is nul voeg het toe aan set s1 en update p1 naar het bovenliggende knooppunt met behulp van de hashtabel.
    • Als p2 dat niet is nul voeg het toe aan set s2 en update p2 naar het bovenliggende knooppunt met behulp van de hashtabel.
  • Zoek de snijpuntset van s1 en s2 dat wil zeggen de reeks knooppunten die gemeenschappelijk zijn voor zowel s1 als s2.
  • Op dit kruispunt vind je maximaal element en retourneer het.

Hieronder vindt u de implementatie van de bovenstaande aanpak:

C++
   // C++ program to find maximum element in the path   // between two Nodes of Binary Search Tree.   #include          using     namespace     std  ;   class     Node     {   public  :         int     data  ;      Node     *  left       *  right  ;          Node  (  int     x  )     {      data     =     x  ;      left     =     right     =     nullptr  ;      }   };   // Insert a new Node in Binary Search Tree   void     insertNode  (  Node     *&  root       int     x  )     {      Node     *  current     =     root       *  parent     =     nullptr  ;          // Traverse to the correct position for insertion      while     (  current     !=     nullptr  )     {      parent     =     current  ;      if     (  x      <     current  ->  data  )      current     =     current  ->  left  ;      else      current     =     current  ->  right  ;      }      // Insert new Node at the correct position      if     (  parent     ==     nullptr  )      root     =     new     Node  (  x  );         else     if     (  x      <     parent  ->  data  )      parent  ->  left     =     new     Node  (  x  );      else      parent  ->  right     =     new     Node  (  x  );   }   // DFS to populate parent map for each node   void     dfs  (  Node     *  root       unordered_map   <  Node  *       Node  *>     &  parentMap        Node     *  parent     =     nullptr  )     {      if     (  !  root  )     return  ;      // Store the parent of the current node      if     (  parent     !=     nullptr  )     {      parentMap  [  root  ]     =     parent  ;      }      // Recur for left and right children      dfs  (  root  ->  left       parentMap       root  );      dfs  (  root  ->  right       parentMap       root  );   }   // Function to find the node with the given value in the BST   Node  *     findNode  (  Node     *  root       int     val  )     {      if     (  !  root  )     return     nullptr  ;      if     (  root  ->  data     ==     val  )      return     root  ;      Node     *  leftResult     =     findNode  (  root  ->  left       val  );      if     (  leftResult  )     return     leftResult  ;      return     findNode  (  root  ->  right       val  );   }   // Find maximum element in the path between two nodes in BST   int     findMaxElement  (  Node     *  root       int     x       int     y  )     {      unordered_map   <  Node  *       Node  *>     parentMap  ;          // Populate parent map with DFS      dfs  (  root       parentMap  );         // Find the nodes corresponding to the       // values x and y      Node     *  p1     =     findNode  (  root       x  );      Node     *  p2     =     findNode  (  root       y  );          // If nodes not found      if     (  !  p1     ||     !  p2  )     return     -1  ;         // Sets to store nodes encountered       // while traversing up the tree      unordered_set   <  Node  *>     s1       s2  ;      // Variable to store the maximum       // element in the path      int     maxElement     =     INT_MIN  ;      // Traverse up the tree from p1 and p2       // and add nodes to sets s1 and s2      while     (  p1     !=     p2  )     {      if     (  p1  )     {      s1  .  insert  (  p1  );      maxElement     =     max  (  maxElement       p1  ->  data  );          // Move to parent node      p1     =     parentMap  [  p1  ];         }      if     (  p2  )     {      s2  .  insert  (  p2  );      maxElement     =     max  (  maxElement       p2  ->  data  );      p2     =     parentMap  [  p2  ];         }      // Check if there's a common node      // in both sets      if     (  s1  .  count  (  p2  ))     break  ;      if     (  s2  .  count  (  p1  ))     break  ;      }      // Now both p1 and p2 point to their Lowest      // Common Ancestor (LCA)      maxElement     =     max  (  maxElement       p1  ->  data  );      return     maxElement  ;   }   int     main  ()     {          vector   <  int  >     arr     =     {  18       36       9       6       12       10       1       8  };      int     a     =     1       b     =     10  ;      int     n     =     arr  .  size  ();          Node     *  root     =     new     Node  (  arr  [  0  ]);      for     (  int     i     =     1  ;     i      <     n  ;     i  ++  )      insertNode  (  root       arr  [  i  ]);      cout      < <     findMaxElement  (  root       a       b  )      < <     endl  ;      return     0  ;   }   
Java
   // Java program to find the maximum element in the path   // between two Nodes of Binary Search Tree.   import     java.util.*  ;   class   Node     {      int     data  ;      Node     left       right  ;      Node  (  int     x  )     {      data     =     x  ;      left     =     right     =     null  ;      }   }   class   GfG     {          // Insert a new Node in Binary Search Tree      static     void     insertNode  (  Node     root       int     x  )     {      Node     current     =     root       parent     =     null  ;      // Traverse to the correct position       // for insertion      while     (  current     !=     null  )     {      parent     =     current  ;      if     (  x      <     current  .  data  )      current     =     current  .  left  ;      else      current     =     current  .  right  ;      }      // Insert new Node at the correct position      if     (  parent     ==     null  )      root     =     new     Node  (  x  );      else     if     (  x      <     parent  .  data  )      parent  .  left     =     new     Node  (  x  );      else      parent  .  right     =     new     Node  (  x  );      }      // DFS to populate parent map for each node      static     void     dfs  (  Node     root       Map   <  Node       Node  >     parentMap        Node     parent  )     {      if     (  root     ==     null  )      return  ;      // Store the parent of the current node      if     (  parent     !=     null  )     {      parentMap  .  put  (  root       parent  );      }      // Recur for left and right children      dfs  (  root  .  left       parentMap       root  );      dfs  (  root  .  right       parentMap       root  );      }      // Function to find the node with the given      // value in the BST      static     Node     findNode  (  Node     root       int     val  )     {      if     (  root     ==     null  )      return     null  ;      if     (  root  .  data     ==     val  )      return     root  ;      Node     leftResult     =     findNode  (  root  .  left       val  );      if     (  leftResult     !=     null  )      return     leftResult  ;      return     findNode  (  root  .  right       val  );      }      // Find maximum element in the path between      // two nodes in BST      static     int     findMaxElement  (  Node     root       int     x       int     y  )     {      Map   <  Node       Node  >     parentMap     =     new     HashMap   <>  ();      // Populate parent map with DFS      dfs  (  root       parentMap       null  );      // Find the nodes corresponding to       // the values x and y      Node     p1     =     findNode  (  root       x  );      Node     p2     =     findNode  (  root       y  );      // If nodes not found      if     (  p1     ==     null     ||     p2     ==     null  )      return     -  1  ;      // Sets to store nodes encountered       // while traversing up the tree      Set   <  Node  >     s1     =     new     HashSet   <>  ();      Set   <  Node  >     s2     =     new     HashSet   <>  ();      // Variable to store the maximum element       // in the path      int     maxElement     =     Integer  .  MIN_VALUE  ;      // Traverse up the tree from p1 and p2       // and add nodes to sets s1 and s2      while     (  p1     !=     p2  )     {      if     (  p1     !=     null  )     {      s1  .  add  (  p1  );      maxElement     =     Math  .  max  (  maxElement       p1  .  data  );      // Move to parent node      p1     =     parentMap  .  get  (  p1  );      }      if     (  p2     !=     null  )     {      s2  .  add  (  p2  );      maxElement     =     Math  .  max  (  maxElement       p2  .  data  );      p2     =     parentMap  .  get  (  p2  );      }      // Check if there's a common node in both sets      if     (  s1  .  contains  (  p2  ))      break  ;      if     (  s2  .  contains  (  p1  ))      break  ;      }      // Now both p1 and p2 point to their       // Lowest Common Ancestor (LCA)      maxElement     =     Math  .  max  (  maxElement       p1  .  data  );      return     maxElement  ;      }      public     static     void     main  (  String  []     args  )     {      int  []     arr     =     {  18       36       9       6       12       10       1       8  };      int     a     =     1       b     =     10  ;      int     n     =     arr  .  length  ;      Node     root     =     new     Node  (  arr  [  0  ]  );      for     (  int     i     =     1  ;     i      <     n  ;     i  ++  )      insertNode  (  root       arr  [  i  ]  );      System  .  out  .  println  (  findMaxElement  (  root       a       b  ));      }   }   
Python
   # Python program to find maximum element in the path   # between two Nodes of Binary Search Tree.   class   Node  :   def   __init__  (  self     x  ):   self  .  data   =   x   self  .  left   =   None   self  .  right   =   None   # Insert a new Node in Binary Search Tree   def   insert_node  (  root     x  ):   current   =   root   parent   =   None   # Traverse to the correct position for insertion   while   current   is   not   None  :   parent   =   current   if   x    <   current  .  data  :   current   =   current  .  left   else  :   current   =   current  .  right   # Insert new Node at the correct position   if   parent   is   None  :   root   =   Node  (  x  )   elif   x    <   parent  .  data  :   parent  .  left   =   Node  (  x  )   else  :   parent  .  right   =   Node  (  x  )   # DFS to populate parent map for each node   def   dfs  (  root     parent_map     parent  =  None  ):   if   root   is   None  :   return   # Store the parent of the current node   if   parent   is   not   None  :   parent_map  [  root  ]   =   parent   # Recur for left and right children   dfs  (  root  .  left     parent_map     root  )   dfs  (  root  .  right     parent_map     root  )   # Function to find the node with the given   # value in the BST   def   find_node  (  root     val  ):   if   root   is   None  :   return   None   if   root  .  data   ==   val  :   return   root   left_result   =   find_node  (  root  .  left     val  )   if   left_result  :   return   left_result   return   find_node  (  root  .  right     val  )   # Find maximum element in the path between    # two nodes in BST   def   find_max_element  (  root     x     y  ):   parent_map   =   {}   # Populate parent map with DFS   dfs  (  root     parent_map  )   # Find the nodes corresponding to the    # values x and y   p1   =   find_node  (  root     x  )   p2   =   find_node  (  root     y  )   # If nodes not found   if   not   p1   or   not   p2  :   return   -  1   # Sets to store nodes encountered    # while traversing up the tree   s1   =   set  ()   s2   =   set  ()   # Variable to store the maximum element in the path   max_element   =   float  (  '-inf'  )   # Traverse up the tree from p1 and p2    # and add nodes to sets s1 and s2   while   p1   !=   p2  :   if   p1  :   s1  .  add  (  p1  )   max_element   =   max  (  max_element     p1  .  data  )   # Move to parent node   p1   =   parent_map  .  get  (  p1  )   if   p2  :   s2  .  add  (  p2  )   max_element   =   max  (  max_element     p2  .  data  )   p2   =   parent_map  .  get  (  p2  )   # Check if there's a common node in both sets   if   p2   in   s1  :   break   if   p1   in   s2  :   break   # Now both p1 and p2 point to their   # Lowest Common Ancestor (LCA)   max_element   =   max  (  max_element     p1  .  data  )   return   max_element   if   __name__   ==   '__main__'  :   arr   =   [  18     36     9     6     12     10     1     8  ]   a     b   =   1     10   n   =   len  (  arr  )   root   =   Node  (  arr  [  0  ])   for   i   in   range  (  1     n  ):   insert_node  (  root     arr  [  i  ])   print  (  find_max_element  (  root     a     b  ))   
C#
   // C# program to find the maximum element in the path   // between two Nodes of Binary Search Tree.   using     System  ;   using     System.Collections.Generic  ;   class     Node     {      public     int     data  ;      public     Node     left       right  ;      public     Node  (  int     x  )     {      data     =     x  ;      left     =     right     =     null  ;      }   }   class     GfG     {          // Insert a new Node in Binary Search Tree      static     public     void     insertNode  (  Node     root       int     x  )     {      Node     current     =     root       parent     =     null  ;      // Traverse to the correct position      // for insertion      while     (  current     !=     null  )     {      parent     =     current  ;      if     (  x      <     current  .  data  )      current     =     current  .  left  ;      else      current     =     current  .  right  ;      }      // Insert new Node at the correct      // position      if     (  parent     ==     null  )      root     =     new     Node  (  x  );      else     if     (  x      <     parent  .  data  )      parent  .  left     =     new     Node  (  x  );      else      parent  .  right     =     new     Node  (  x  );      }      // DFS to populate parent map for each node      static     public     void     dfs  (  Node     root           Dictionary   <  Node       Node  >     parentMap       Node     parent  )     {      if     (  root     ==     null  )      return  ;      // Store the parent of the current node      if     (  parent     !=     null  )     {      parentMap  [  root  ]     =     parent  ;      }      // Recur for left and right children      dfs  (  root  .  left       parentMap       root  );      dfs  (  root  .  right       parentMap       root  );      }      // Function to find the node with the given      // value in the BST      static     public     Node     findNode  (  Node     root       int     val  )     {      if     (  root     ==     null  )      return     null  ;      if     (  root  .  data     ==     val  )      return     root  ;      Node     leftResult     =     findNode  (  root  .  left       val  );      if     (  leftResult     !=     null  )      return     leftResult  ;      return     findNode  (  root  .  right       val  );      }      // Find maximum element in the path between       // two nodes in BST      static     public     int     findMaxElement  (  Node     root       int     x       int     y  )     {      Dictionary   <  Node       Node  >     parentMap     =     new     Dictionary   <  Node       Node  >  ();      // Populate parent map with DFS      dfs  (  root       parentMap       null  );      // Find the nodes corresponding to       // the values x and y      Node     p1     =     findNode  (  root       x  );      Node     p2     =     findNode  (  root       y  );      // If nodes not found      if     (  p1     ==     null     ||     p2     ==     null  )      return     -  1  ;      // Sets to store nodes encountered       // while traversing up the tree      HashSet   <  Node  >     s1     =     new     HashSet   <  Node  >  ();      HashSet   <  Node  >     s2     =     new     HashSet   <  Node  >  ();      // Variable to store the maximum element       // in the path      int     maxElement     =     int  .  MinValue  ;      // Traverse up the tree from p1 and p2       // and add nodes to sets s1 and s2      while     (  p1     !=     p2  )     {      if     (  p1     !=     null  )     {      s1  .  Add  (  p1  );      maxElement     =     Math  .  Max  (  maxElement       p1  .  data  );      // Move to parent node      p1     =     parentMap  [  p1  ];      }      if     (  p2     !=     null  )     {      s2  .  Add  (  p2  );      maxElement     =     Math  .  Max  (  maxElement       p2  .  data  );      p2     =     parentMap  [  p2  ];      }      // Check if there's a common node in both sets      if     (  s1  .  Contains  (  p2  ))      break  ;      if     (  s2  .  Contains  (  p1  ))      break  ;      }      // Now both p1 and p2 point to their Lowest       // Common Ancestor (LCA)      maxElement     =     Math  .  Max  (  maxElement       p1  .  data  );      return     maxElement  ;      }      static     void     Main  ()     {      int  []     arr     =     {  18       36       9       6       12       10       1       8  };      int     a     =     1       b     =     10  ;      int     n     =     arr  .  Length  ;      Node     root     =     new     Node  (  arr  [  0  ]);      for     (  int     i     =     1  ;     i      <     n  ;     i  ++  )      insertNode  (  root       arr  [  i  ]);      Console  .  WriteLine  (  findMaxElement  (  root       a       b  ));      }   }   
JavaScript
   // JavaScript program to find the maximum element in the path   // between two Nodes of Binary Search Tree.   class     Node     {      constructor  (  x  )     {      this  .  data     =     x  ;      this  .  left     =     this  .  right     =     null  ;      }   }   // Insert a new Node in Binary Search Tree   function     insertNode  (  root       x  )     {      let     current     =     root       parent     =     null  ;      // Traverse to the correct position for insertion      while     (  current     !==     null  )     {      parent     =     current  ;      if     (  x      <     current  .  data  )      current     =     current  .  left  ;      else      current     =     current  .  right  ;      }      // Insert new Node at the correct position      if     (  parent     ===     null  )      root     =     new     Node  (  x  );      else     if     (  x      <     parent  .  data  )      parent  .  left     =     new     Node  (  x  );      else      parent  .  right     =     new     Node  (  x  );   }   // DFS to populate parent map for each node   function     dfs  (  root       parentMap       parent     =     null  )     {      if     (  root     ===     null  )     return  ;      // Store the parent of the current node      if     (  parent     !==     null  )     {      parentMap  .  set  (  root       parent  );      }      // Recur for left and right children      dfs  (  root  .  left       parentMap       root  );      dfs  (  root  .  right       parentMap       root  );   }   // Function to find the node with the given    // value in the BST   function     findNode  (  root       val  )     {      if     (  root     ===     null  )     return     null  ;      if     (  root  .  data     ===     val  )      return     root  ;      let     leftResult     =     findNode  (  root  .  left       val  );      if     (  leftResult     !==     null  )      return     leftResult  ;      return     findNode  (  root  .  right       val  );   }   // Find maximum element in the path   // between two nodes in BST   function     findMaxElement  (  root       x       y  )     {      let     parentMap     =     new     Map  ();      // Populate parent map with DFS      dfs  (  root       parentMap  );      // Find the nodes corresponding to the      // values x and y      let     p1     =     findNode  (  root       x  );      let     p2     =     findNode  (  root       y  );      // If nodes not found      if     (  p1     ===     null     ||     p2     ===     null  )      return     -  1  ;      // Sets to store nodes encountered      let     s1     =     new     Set  ();      let     s2     =     new     Set  ();      // Variable to store the maximum       // element in the path      let     maxElement     =     -  Infinity  ;      // Traverse up the tree from p1 and p2       // and add nodes to sets s1 and s2      while     (  p1     !==     p2  )     {      if     (  p1     !==     null  )     {      s1  .  add  (  p1  );      maxElement     =     Math  .  max  (  maxElement       p1  .  data  );      // Move to parent node      p1     =     parentMap  .  get  (  p1  );      }      if     (  p2     !==     null  )     {      s2  .  add  (  p2  );      maxElement     =     Math  .  max  (  maxElement       p2  .  data  );      p2     =     parentMap  .  get  (  p2  );      }      // Check if there's a common node in both sets      if     (  s1  .  has  (  p2  ))     break  ;      if     (  s2  .  has  (  p1  ))     break  ;      }      // Now both p1 and p2 point to their Lowest       // Common Ancestor (LCA)      maxElement     =     Math  .  max  (  maxElement       p1  .  data  );      return     maxElement  ;   }   let     arr     =     [  18       36       9       6       12       10       1       8  ];   let     a     =     1       b     =     10  ;   let     n     =     arr  .  length  ;   let     root     =     new     Node  (  arr  [  0  ]);   for     (  let     i     =     1  ;     i      <     n  ;     i  ++  )      insertNode  (  root       arr  [  i  ]);   console  .  log  (  findMaxElement  (  root       a       b  ));   

Uitvoer
12  

[Verwachte aanpak] Met behulp van LCA van twee knooppunten: O(h) Tijd en O(h) Ruimte

Het idee is om te vinden Laagste gemeenschappelijke voorouder van knooppunt 'a' en knooppunt 'b'. Zoek vervolgens het maximale knooppunt tussen LCA en 'a' en vind ook het maximale knooppunt tussen LCA en 'b'. Het antwoord is maximaal knooppunt twee.

Hieronder ziet u de implementatie van het bovenstaande algoritme:

C++
   // C++ program to find maximum element in the path   // between two Nodes of Binary Search Tree.   #include          using     namespace     std  ;   class     Node     {      public  :      Node     *  left       *  right  ;      int     data  ;      Node  (  int     x  )     {      data     =     x  ;      left     =     right     =     nullptr  ;      }   };   // Insert a new Node in Binary Search Tree.   void     insertNode  (  struct     Node     *  root       int     x  )     {      Node     *  current     =     root       *  parent     =     nullptr  ;      while     (  current     !=     nullptr  )     {      parent     =     current  ;      if     (  current  ->  data      <     x  )      current     =     current  ->  right  ;      else      current     =     current  ->  left  ;      }      if     (  parent     ==     nullptr  )      current     =     new     Node  (  x  );      else     {      if     (  parent  ->  data      <     x  )      parent  ->  right     =     new     Node  (  x  );      else      parent  ->  left     =     new     Node  (  x  );      }   }   // Return the maximum element between a Node   // and its given ancestor.   int     maxelpath  (  Node     *  root       int     x  )     {      Node     *  current     =     root  ;      int     mx     =     INT_MIN  ;      // Traversing the path between ancestor and      // Node and finding maximum element.      while     (  current  ->  data     !=     x  )     {      if     (  current  ->  data     >     x  )     {      mx     =     max  (  mx       current  ->  data  );      current     =     current  ->  left  ;      }      else     {      mx     =     max  (  mx       current  ->  data  );      current     =     current  ->  right  ;      }      }      return     max  (  mx       x  );   }   // Return maximum element in the path between   // two given Node of BST.   int     maximumElement  (  Node     *  root       int     x       int     y  )     {      Node     *  current     =     root  ;      // Finding the LCA of Node x and Node y      while     ((  x      <     current  ->  data     &&     y      <     current  ->  data  )         ||     (  x     >     current  ->  data     &&     y     >     current  ->  data  ))     {      // Checking if both the Node lie on the      // left side of the parent p.      if     (  x      <     current  ->  data     &&     y      <     current  ->  data  )      current     =     current  ->  left  ;      // Checking if both the Node lie on the      // right side of the parent p.      else     if     (  x     >     current  ->  data     &&     y     >     current  ->  data  )      current     =     current  ->  right  ;      }      // Return the maximum of maximum elements occur      // in path from ancestor to both Node.      return     max  (  maxelpath  (  current       x  )     maxelpath  (  current       y  ));   }   int     main  ()     {      int     arr  []     =     {  18       36       9       6       12       10       1       8  };      int     a     =     1       b     =     10  ;      int     n     =     sizeof  (  arr  )     /     sizeof  (  arr  [  0  ]);      Node     *  root     =     new     Node  (  arr  [  0  ]);      for     (  int     i     =     1  ;     i      <     n  ;     i  ++  )      insertNode  (  root       arr  [  i  ]);      cout      < <     maximumElement  (  root       a       b  )      < <     endl  ;      return     0  ;   }   
Java
   // Java program to find maximum element in the path   // between two Nodes of Binary Search Tree.   import     java.util.*  ;   class   Node     {      int     data  ;      Node     left       right  ;      Node  (  int     x  )     {      data     =     x  ;      left     =     right     =     null  ;      }   }   class   GfG     {          // Insert a new Node in Binary Search Tree      static     void     insertNode  (  Node     root       int     x  )     {      Node     current     =     root       parent     =     null  ;      // Traverse to the correct       // position for insertion      while     (  current     !=     null  )     {      parent     =     current  ;      if     (  x      <     current  .  data  )      current     =     current  .  left  ;      else      current     =     current  .  right  ;      }      // Insert new Node at the correct       // position      if     (  parent     ==     null  )      root     =     new     Node  (  x  );      else     if     (  x      <     parent  .  data  )      parent  .  left     =     new     Node  (  x  );      else      parent  .  right     =     new     Node  (  x  );      }      // Find maximum element in the path from       // an ancestor to a node      static     int     maxInPath  (  Node     root       int     x  )     {      int     maxElement     =     Integer  .  MIN_VALUE  ;      Node     current     =     root  ;      // Traverse the path from root to the       // target node 'x'      while     (  current     !=     null     &&     current  .  data     !=     x  )     {      maxElement     =     Math  .  max  (  maxElement       current  .  data  );      if     (  x      <     current  .  data  )      current     =     current  .  left  ;      else      current     =     current  .  right  ;      }      return     Math  .  max  (  maxElement       x  );         }      // Find maximum element in the path between two      // nodes in BST      static     int     findMaxElement  (  Node     root       int     x       int     y  )     {      Node     current     =     root  ;      // Find Lowest Common Ancestor (LCA) of x and y      while     ((  x      <     current  .  data     &&     y      <     current  .  data  )         ||     (  x     >     current  .  data     &&     y     >     current  .  data  ))     {      if     (  x      <     current  .  data     &&     y      <     current  .  data  )      current     =     current  .  left  ;      else     if     (  x     >     current  .  data     &&     y     >     current  .  data  )      current     =     current  .  right  ;      }      // Find maximum elements in paths from LCA       // to x and LCA to y      return     Math  .  max  (  maxInPath  (  current       x  )     maxInPath  (  current       y  ));      }      public     static     void     main  (  String  []     args  )     {      int  []     arr     =     {  18       36       9       6       12       10       1       8  };      int     a     =     1       b     =     10  ;      Node     root     =     new     Node  (  arr  [  0  ]  );      for     (  int     i     =     1  ;     i      <     arr  .  length  ;     i  ++  )      insertNode  (  root       arr  [  i  ]  );          System  .  out  .  println  (  findMaxElement  (  root       a       b  ));      }   }   
Python
   # Python program to find maximum element in the path   # between two Nodes of Binary Search Tree.   class   Node  :   def   __init__  (  self     x  ):   self  .  data   =   x   self  .  left   =   None   self  .  right   =   None   # Insert a new Node in Binary Search Tree   def   insertNode  (  root     x  ):   current   =   root   parent   =   None   # Traverse to the correct position for insertion   while   current   is   not   None  :   parent   =   current   if   x    <   current  .  data  :   current   =   current  .  left   else  :   current   =   current  .  right   # Insert new Node at the correct position   if   parent   is   None  :   root   =   Node  (  x  )   elif   x    <   parent  .  data  :   parent  .  left   =   Node  (  x  )   else  :   parent  .  right   =   Node  (  x  )   # Find maximum element in the path from an   # ancestor to a node   def   maxInPath  (  root     x  ):   maxElement   =   float  (  '-inf'  )   current   =   root   # Traverse the path from root to the   # target node 'x'   while   current   is   not   None   and   current  .  data   !=   x  :   maxElement   =   max  (  maxElement     current  .  data  )   if   x    <   current  .  data  :   current   =   current  .  left   else  :   current   =   current  .  right   return   max  (  maxElement     x  )   # Find maximum element in the path between   # two nodes in BST   def   findMaxElement  (  root     x     y  ):   current   =   root   # Find Lowest Common Ancestor (LCA) of x and y   while   (  x    <   current  .  data   and   y    <   current  .  data  )    or   (  x   >   current  .  data   and   y   >   current  .  data  ):   if   x    <   current  .  data   and   y    <   current  .  data  :   current   =   current  .  left   elif   x   >   current  .  data   and   y   >   current  .  data  :   current   =   current  .  right   # Find maximum elements in paths from LCA to   # x and LCA to y   return   max  (  maxInPath  (  current     x  )   maxInPath  (  current     y  ))   if   __name__   ==   '__main__'  :   arr   =   [  18     36     9     6     12     10     1     8  ]   a     b   =   1     10   root   =   Node  (  arr  [  0  ])   for   i   in   range  (  1     len  (  arr  )):   insertNode  (  root     arr  [  i  ])   print  (  findMaxElement  (  root     a     b  ))   
C#
   // C# program to find maximum element in the path   // between two Nodes of Binary Search Tree.   using     System  ;   class     Node     {      public     int     data  ;      public     Node     left       right  ;      public     Node  (  int     x  )     {      data     =     x  ;      left     =     right     =     null  ;      }   }   class     GfG     {          // Insert a new Node in Binary Search Tree      static     void     insertNode  (  Node     root       int     x  )     {      Node     current     =     root       parent     =     null  ;      // Traverse to the correct position      // for insertion      while     (  current     !=     null  )     {      parent     =     current  ;      if     (  x      <     current  .  data  )      current     =     current  .  left  ;      else      current     =     current  .  right  ;      }      // Insert new Node at the correct position      if     (  parent     ==     null  )      root     =     new     Node  (  x  );      else     if     (  x      <     parent  .  data  )      parent  .  left     =     new     Node  (  x  );      else      parent  .  right     =     new     Node  (  x  );      }      // Find maximum element in the path from an       // ancestor to a node      static     int     maxInPath  (  Node     root       int     x  )     {      int     maxElement     =     int  .  MinValue  ;      Node     current     =     root  ;      // Traverse the path from root to the target node 'x'      while     (  current     !=     null     &&     current  .  data     !=     x  )     {      maxElement     =     Math  .  Max  (  maxElement       current  .  data  );      if     (  x      <     current  .  data  )      current     =     current  .  left  ;      else      current     =     current  .  right  ;      }      return     Math  .  Max  (  maxElement       x  );      }      // Find maximum element in the path between two nodes in BST      static     int     findMaxElement  (  Node     root       int     x       int     y  )     {      Node     current     =     root  ;      // Find Lowest Common Ancestor (LCA) of x and y      while     ((  x      <     current  .  data     &&     y      <     current  .  data  )         ||     (  x     >     current  .  data     &&     y     >     current  .  data  ))     {      if     (  x      <     current  .  data     &&     y      <     current  .  data  )      current     =     current  .  left  ;      else     if     (  x     >     current  .  data     &&     y     >     current  .  data  )      current     =     current  .  right  ;      }      // Find maximum elements in paths from      // LCA to x and LCA to y      return     Math  .  Max  (  maxInPath  (  current       x  )     maxInPath  (  current       y  ));      }      static     void     Main  ()     {      int  []     arr     =     {  18       36       9       6       12       10       1       8  };      int     a     =     1       b     =     10  ;      Node     root     =     new     Node  (  arr  [  0  ]);          for     (  int     i     =     1  ;     i      <     arr  .  Length  ;     i  ++  )      insertNode  (  root       arr  [  i  ]);      Console  .  WriteLine  (  findMaxElement  (  root       a       b  ));      }   }   
JavaScript
   // JavaScript program to find maximum element in the path   // between two Nodes of Binary Search Tree.   class     Node     {      constructor  (  x  )     {      this  .  data     =     x  ;      this  .  left     =     null  ;      this  .  right     =     null  ;      }   }   // Insert a new Node in Binary Search Tree   function     insertNode  (  root       x  )     {      let     current     =     root       parent     =     null  ;      // Traverse to the correct position for insertion      while     (  current     !==     null  )     {      parent     =     current  ;      if     (  x      <     current  .  data  )      current     =     current  .  left  ;      else      current     =     current  .  right  ;      }      // Insert new Node at the correct position      if     (  parent     ===     null  )      root     =     new     Node  (  x  );      else     if     (  x      <     parent  .  data  )      parent  .  left     =     new     Node  (  x  );      else      parent  .  right     =     new     Node  (  x  );   }   // Find maximum element in the path from an    // ancestor to a node   function     maxInPath  (  root       x  )     {      let     maxElement     =     -  Infinity  ;      let     current     =     root  ;      // Traverse the path from root to the target node 'x'      while     (  current     !==     null     &&     current  .  data     !==     x  )     {      maxElement     =     Math  .  max  (  maxElement       current  .  data  );      if     (  x      <     current  .  data  )      current     =     current  .  left  ;      else      current     =     current  .  right  ;      }      return     Math  .  max  (  maxElement       x  );   }   // Find maximum element in the path between   // two nodes in BST   function     findMaxElement  (  root       x       y  )     {      let     current     =     root  ;      // Find Lowest Common Ancestor (LCA) of x and y      while     ((  x      <     current  .  data     &&     y      <     current  .  data  )         ||     (  x     >     current  .  data     &&     y     >     current  .  data  ))     {      if     (  x      <     current  .  data     &&     y      <     current  .  data  )      current     =     current  .  left  ;      else     if     (  x     >     current  .  data     &&     y     >     current  .  data  )      current     =     current  .  right  ;      }      // Find maximum elements in paths from LCA to       // x and LCA to y      return     Math  .  max  (  maxInPath  (  current       x  )     maxInPath  (  current       y  ));   }   const     arr     =     [  18       36       9       6       12       10       1       8  ];   const     a     =     1       b     =     10  ;   const     root     =     new     Node  (  arr  [  0  ]);   for     (  let     i     =     1  ;     i      <     arr  .  length  ;     i  ++  )     {      insertNode  (  root       arr  [  i  ]);   }   console  .  log  (  findMaxElement  (  root       a       b  ));   

Uitvoer
12  
Quiz maken