Максимални елемент између два чвора БСТ-а

Максимални елемент између два чвора БСТ-а

С обзиром на низ н елемената и два цела броја а б који припадају датом низу. Направите а Бинарно стабло претраге уметањем елемената из арр[0] до арр[н-1] . Задатак је пронаћи максимум елемент на путу од а до б.

Пример:

Улаз: арр[] = { 18 36 9 6 12 10 1 8 } а = 1 б = 10.
Излаз : 12

Максимални-елемент-између-два-чвора-БСТ-а

Објашњење: Пут од 1 до 10 садржи { 1 6 9 12 10 } . Максимални елемент је 12.

Садржај

[Наивни приступ] Коришћење хеширања - О(н * лог н) Време и О(н) Простор

Идеја је да се користи а хасхмап за чување родитељ чвор сваког чвора у бинарно стабло претраге . Можемо почети од оба дата чвора и прећи стаблом чувајући чворове на које се наилази у а сет . Једном када дођемо до корена или заједничког претка два чвора, можемо прећи низ дрво од сваког чвора и пронаћи максимум елемент који се среће у скупу чворова.

Кораци алгоритма за горњи приступ:

  • Направите празно хасх табле за чување родитељ чвор сваког чвора у бинарном стаблу претраге.
  • Извршите а претрага у дубину (ДФС) обилазак бинарног стабла претраге и попунити хеш табелу са родитељским чвором сваког чвора.
  • Иницијализујте два показивача рецимо п1 и п2 на дате чворове.
  • Иницијализујте два празна скупа рецимо с1 и с2 за чување чворова на које наиђете док се крећете по стаблу од п1 и п2 односно.
  • Док п1 и п2 су није једнака урадите следеће:
    • Ако п1 није нулл додајте га у скуп с1 и ажурирати п1 свом родитељском чвору користећи хеш табелу.
    • Ако п2 није нулл додајте га у скуп с2 и ажурирати п2 свом родитељском чвору користећи хеш табелу.
  • Пронађите скуп пресека од с1 и с2 односно скуп чворова који су заједнички и за с1 и за с2.
  • На овој раскрсници пронађите максимум елемент и врати га.

Испод је примена горњег приступа:

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

Излаз
12  

[Очекивани приступ] Коришћење ЛЦА два чвора - О(х) Време и О(х) Простор

Идеја је пронаћи Најнижи заједнички предак чвора 'а' и чвора 'б'. Затим потражите максимални чвор између ЛЦА и 'а' и такође пронађите максимални чвор између ЛЦА и 'б'. Одговор ће бити максимални чвор од два.

Испод је имплементација горњег алгоритма:

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

Излаз
12  
Креирај квиз