class ĠBinary Search Tree < T Ġ: ĠComparable < T >> Ġ{ ĊĊĠĠĠ Ġdata Ġclass ĠNode < T >( val Ġdata : ĠT , Ġvar Ġleft : ĠNode < T >? Ġ= Ġnull , Ġvar Ġright : ĠNode < T >? Ġ= Ġnull ) ĊĊĠĠĠ Ġvar Ġroot : ĠNode < T >? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġinsert ( value : ĠT , Ġnode : ĠNode < T >? Ġ= Ġroot ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Ġ== Ġnull Ġ-> Ġroot Ġ= ĠNode ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode !!. data Ġ< Ġvalue Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . right Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . right Ġ= ĠNode ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert ( value , Ġnode . right ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . data Ġ>= Ġvalue Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . left Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . left Ġ= ĠNode ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert ( value , Ġnode . left ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġas Sort edList ( node : ĠNode < T >? Ġ= Ġroot ): ĠList < T > Ġ= Ġif Ġ( node Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġas Sort edList ( node . left ) Ġ+ ĠlistOf ( node . data ) Ġ+ Ġas Sort edList ( node . right ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġas Level Order List (): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnodes Ġ= Ġmutable ListOf ( root ) ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġnodes . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( nodes [ i ]?. left Ġ!= Ġnull ) Ġnodes . add ( nodes [ i ]?. left ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( nodes [ i ]?. right Ġ!= Ġnull ) Ġnodes . add ( nodes [ i ]?. right ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnodes . filter NotNull (). map Ġ{ Ġit . data Ġ} ĊĠĠĠ Ġ} Ċ Ċ } ĊĊ