package Ġtree . b int ree Ċ Ċ // ĠL argest ĠCommon ĠAn cestor Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ Ċ ĉ // Ġ 5 Ġ-> Ġ{ 2 Ġ-> Ġ{ null , Ġnull }, Ġ 6 Ġ-> Ġ{ null , Ġ 1 4 }} Ċ ĉ val Ġroot Ġ= ĠBin TreeNode ( 5 ) Ċ ĉ root . left Ġ= ĠBin TreeNode ( 2 ) Ċ ĉ root . right Ġ= ĠBin TreeNode ( 6 ) Ċ ĉ root . right !!. right Ġ= ĠBin TreeNode ( 1 4 ) Ċ ĉ println ( root . bt L CA ( root . left !! , Ġroot . right !!. right !! ) !!. data ) Ċ ĉ println ( root . bst L CA Recur ( root . left !! , Ġroot . right !!. right !! ) !!. data ) Ċ ĉ println ( root . bst L CA Iter ( root . left !! , Ġroot . right !!. right !! ) !!. data ) Ċ } Ċ Ċ // Ġbinary Ġtree Ċ fun ĠBin TreeNode < Int >. bt L CA ( t 1 : ĠBin TreeNode < Int >, Ġt 2 : ĠBin TreeNode < Int >): ĠBin TreeNode < Int >? Ġ{ Ċ ĉ if Ġ( this Ġ== Ġt 1 Ġ|| Ġthis Ġ== Ġt 2 ) Ġ{ Ċĉ ĉ return Ġthis Ċ ĉ } ĊĊ ĉ val Ġleft Ġ= Ġthis . left ?. bt L CA ( t 1 , Ġt 2 ) Ċ ĉ val Ġright Ġ= Ġthis . right ?. bt L CA ( t 1 , Ġt 2 ) ĊĊ ĉ if Ġ( left Ġ!= Ġnull Ġ&& Ġright Ġ!= Ġnull ) Ġ{ Ċĉ ĉ return Ġthis Ċ ĉ } ĊĊ ĉ return Ġleft Ġ?: Ġright Ċ } Ċ Ċ // Ġbinary Ġsearch Ġtree Ċ fun ĠBin TreeNode < Int >. bst L CA Recur ( t 1 : ĠBin TreeNode < Int >, Ġt 2 : ĠBin TreeNode < Int >): ĠBin TreeNode < Int >? Ġ{ Ċ ĉ if Ġ( this . data Ġ> Ġt 1 . data Ġ&& Ġthis . data Ġ> Ġt 2 . data ) Ġ{ Ċĉ ĉ return Ġthis . left ?. bst L CA Recur ( t 1 , Ġt 2 ) Ċ ĉ } ĊĊ ĉ if Ġ( this . data Ġ< Ġt 1 . data Ġ&& Ġthis . data Ġ< Ġt 2 . data ) Ġ{ Ċĉ ĉ return Ġthis . right ?. bst L CA Recur ( t 1 , Ġt 2 ) Ċ ĉ } ĊĊ ĉ return Ġthis Ċ } Ċ Ċ fun ĠBin TreeNode < Int >. bst L CA Iter ( t 1 : ĠBin TreeNode < Int >, Ġt 2 : ĠBin TreeNode < Int >): ĠBin TreeNode < Int >? Ġ{ Ċ ĉ var Ġnode : ĠBin TreeNode < Int >? Ġ= Ġthis Ċ ĉ while Ġ( node Ġ!= Ġnull ) Ġ{ Ċĉ ĉ node Ġ= Ġif Ġ( node . data Ġ< Ġt 1 . data Ġ&& Ġnode . data Ġ< Ġt 2 . data ) Ġ{ Ċĉĉ ĉ node . left Ċĉ ĉ } Ġelse Ġif Ġ( node . data Ġ> Ġt 1 . data Ġ&& Ġnode . data Ġ> Ġt 2 . data ) Ġ{ Ċĉĉ ĉ node . right Ċĉ ĉ } Ġelse Ġ{ Ċĉĉ ĉ break Ċĉ ĉ } Ċ ĉ } Ċ ĉ return Ġnode Ċ } Ċ