/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠPoly ĠForest , ĠLLC Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ @ file : Suppress (" unused ") Ċ Ċ package Ġcom . ac orn ui Ċ Ċ import Ġcom . ac orn ui . collection .* Ċ Ċ /** Ċ Ġ* ĠAn Ġabstract Ġtree Ġnode . Ċ Ġ*/ Ċ interface ĠNode Ġ{ ĊĊ ĉ /** Ċĉ Ġ* ĠReturns Ġa Ġread - only Ġlist Ġof Ġthe Ġchildren . Ċĉ Ġ*/ Ċ ĉ val Ġchildren : ĠList < Node > Ċ Ċ } Ċ Ċ //------------------------------------------------ Ċ // ĠH ierarchy Ġtraversal Ġmethods Ċ //------------------------------------------------ Ċ Ċ /** Ċ Ġ* ĠFlags Ġfor Ġwhat Ġrelative Ġnodes Ġto Ġskip Ġwhen Ġtra ver sing Ġa Ġhierarchy . Ċ Ġ*/ Ċ enum Ġclass ĠTree Walk Ġ{ ĊĊ ĉ /** Ċĉ Ġ* ĠCont in ues Ġiteration Ġnormally . Ċĉ Ġ*/ Ċ ĉ CONTINUE , ĊĊ ĉ /** Ċĉ Ġ* ĠSk ips Ġall Ġremaining Ġnodes , Ġhal ting Ġiteration . Ċĉ Ġ*/ Ċ ĉ HAL T , ĊĊ ĉ /** Ċĉ Ġ* ĠSk ips Ġcurrent Ġnode 's Ġchildren . Ċĉ Ġ*/ Ċ ĉ SKIP , ĊĊ ĉ /** Ċĉ Ġ* ĠDis cards Ġnodes Ġnot Ġdescending Ġfrom Ġcurrent Ġnode . Ċĉ Ġ* ĠThis Ġwill Ġhave Ġno Ġeffect Ġin Ġpost - order Ġtraversal . Ċĉ Ġ*/ Ċ ĉ IS OL ATE Ċ Ċ } Ċ Ċ //------------------------------------------------ - Ċ // ĠLevel Ġorder Ċ //------------------------------------------------ - Ċ Ċ /** Ċ Ġ* ĠA Ġlevel - order Ġchild Ġwalk . Ċ Ġ* ĠTr aver ses Ġthis Ġparent 's Ġhierarchy Ġfrom Ġtop Ġto Ġbottom , Ġb read th Ġfirst , Ġinvoking Ġa Ġcallback Ġon Ġeach Ġnode . Ċ Ġ* Ġ( including Ġ` this ` Ġreceiver Ġobject ). Ċ Ġ* Ċ Ġ* Ġ@ param Ġreversed ĠIf Ġtrue , Ġthe Ġlast Ġnode Ġwill Ġbe Ġadded Ġto Ġthe Ġqueue Ġfirst . Ċ Ġ* Ġ@ param Ġcallback ĠThe Ġcallback Ġto Ġinvoke Ġon Ġeach Ġnode . Ċ Ġ* Ġ@ return ĠReturns Ġthe Ġelement , Ġif Ġany , Ġwhere Ġ[ callback ] Ġreturned Ġ[ Tree Walk . HAL T ]. Ċ Ġ*/ Ċ fun ĠNode . child Walk Level Order ( reversed : ĠBoolean , Ġcallback : Ġ( Node ) Ġ-> ĠTree Walk ): ĠNode ? Ġ{ Ċ ĉ val Ġopen List Ġ= ĠArrayList < Node >() Ċ ĉ open List . add ( this ) Ċ ĉ var Ġfound : ĠNode ? Ġ= Ġnull Ċ ĉ loop @ Ġwhile Ġ( open List . isNotEmpty ()) Ġ{ Ċĉ ĉ val Ġnext Ġ= Ġopen List . shift () Ċĉ ĉ when Ġ( callback ( next )) Ġ{ Ċĉĉ ĉ Tree Walk . HAL T Ġ-> Ġ{ Ċĉĉĉ ĉ found Ġ= Ġnext Ċĉĉĉ ĉ break @ loop Ċĉĉ ĉ } Ċĉĉ ĉ Tree Walk . SKIP Ġ-> Ġcontinue @ loop Ċĉĉ ĉ Tree Walk . IS OL ATE Ġ-> Ġ{ Ċĉĉĉ ĉ open List . clear () Ċĉĉ ĉ } Ċĉĉ ĉ else Ġ-> Ġ{ Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ if Ġ( reversed ) Ġ{ Ċĉĉ ĉ for Ġ( i Ġin Ġnext . children . last Index Ġdown To Ġ 0 ) Ċĉĉĉ ĉ open List . add ( next . children [ i ]) Ċĉ ĉ } Ġelse Ċĉĉ ĉ open List . addAll ( next . children ) Ċ ĉ } Ċ ĉ return Ġfound Ċ } Ċ Ċ fun ĠNode . child Walk Level Order ( callback : Ġ( Node ) Ġ-> ĠTree Walk ) Ġ{ Ċ ĉ child Walk Level Order ( false , Ġcallback ) Ċ } Ċ Ċ fun ĠNode . child Walk Level Order Re versed ( callback : Ġ( Node ) Ġ-> ĠTree Walk ) Ġ{ Ċ ĉ child Walk Level Order ( true , Ġcallback ) Ċ } Ċ Ċ /** Ċ Ġ* ĠGiven Ġa Ġcallback Ġthat Ġreturns Ġtrue Ġif Ġthe Ġdesc endant Ġis Ġfound , Ġthis Ġmethod Ġwill Ġreturn Ġthe Ġfirst Ġdesc endant Ġwith Ċ Ġ* Ġthe Ġmatching Ġcondition . Ċ Ġ* ĠThe Ġtree Ġtraversal Ġwill Ġbe Ġlevel - order . Ċ Ġ*/ Ċ fun ĠNode . find Child Level Order ( reversed : ĠBoolean , Ġcallback : ĠFilter < Node >): ĠNode ? Ġ{ Ċ ĉ return Ġchild Walk Level Order ( reversed ) Ġ{ Ċĉ ĉ if Ġ( callback ( it )) ĠTree Walk . HAL T Ġelse ĠTree Walk . CONTINUE Ċ ĉ } Ċ } Ċ Ċ fun ĠNode . find Child Level Order ( callback : ĠFilter < Node >): ĠNode ? Ġ{ Ċ ĉ return Ġfind Child Level Order ( reversed Ġ= Ġfalse , Ġcallback Ġ= Ġcallback ) Ċ } Ċ Ċ fun ĠNode . find Last Child Level Order ( callback : ĠFilter < Node >): ĠNode ? Ġ{ Ċ ĉ return Ġfind Child Level Order ( reversed Ġ= Ġtrue , Ġcallback Ġ= Ġcallback ) Ċ } Ċ Ċ //------------------------------------------------ - Ċ // ĠPre - order Ċ //------------------------------------------------ - Ċ Ċ /** Ċ Ġ* ĠA Ġpre - order Ġchild Ġwalk . Ċ Ġ* Ċ Ġ* Ġ@ param Ġcallback ĠThe Ġcallback Ġto Ġinvoke Ġon Ġeach Ġchild . Ċ Ġ* Ġ@ return ĠReturns Ġthe Ġnode , Ġif Ġany , Ġwhere Ġ[ callback ] Ġreturned Ġ[ Tree Walk . HAL T ] Ċ Ġ*/ Ċ fun ĠNode . child Walk Pre order ( reversed : ĠBoolean , Ġcallback : Ġ( Node ) Ġ-> ĠTree Walk ): ĠNode ? Ġ{ Ċ ĉ val Ġopen List Ġ= ĠArrayList < Node >() Ċ ĉ open List . add ( this ) Ċ ĉ var Ġfound : ĠNode ? Ġ= Ġnull Ċ ĉ loop @ Ġwhile Ġ( open List . isNotEmpty ()) Ġ{ Ċĉ ĉ val Ġnext Ġ= Ġopen List . pop () Ċĉ ĉ when Ġ( callback ( next )) Ġ{ Ċĉĉ ĉ Tree Walk . HAL T Ġ-> Ġ{ Ċĉĉĉ ĉ found Ġ= Ġnext Ċĉĉĉ ĉ break @ loop Ċĉĉ ĉ } Ċĉĉ ĉ Tree Walk . SKIP Ġ-> Ġcontinue @ loop Ċĉĉ ĉ Tree Walk . IS OL ATE Ġ-> Ġ{ Ċĉĉĉ ĉ open List . clear () Ċĉĉ ĉ } Ċĉĉ ĉ else Ġ-> Ġ{ Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ if Ġ( reversed ) Ġ{ Ċĉĉ ĉ open List . addAll ( next . children ) Ċĉ ĉ } Ġelse Ċĉĉ ĉ for Ġ( i Ġin Ġnext . children . last Index Ġdown To Ġ 0 ) Ċĉĉĉ ĉ open List . add ( next . children [ i ]) Ċ ĉ } Ċ ĉ return Ġfound Ċ } Ċ Ċ fun ĠNode . child Walk Pre order ( callback : Ġ( Node ) Ġ-> ĠTree Walk ) Ġ{ Ċ ĉ child Walk Pre order ( false , Ġcallback ) Ċ } Ċ Ċ fun ĠNode . child Walk Pre order Re versed ( callback : Ġ( Node ) Ġ-> ĠTree Walk ) Ġ{ Ċ ĉ child Walk Pre order ( true , Ġcallback ) Ċ } Ċ Ċ /** Ċ Ġ* ĠGiven Ġa Ġcallback Ġthat Ġreturns Ġtrue Ġif Ġthe Ġdesc endant Ġis Ġfound , Ġthis Ġmethod Ġwill Ġreturn Ġthe Ġfirst Ġdesc endant Ġwith Ċ Ġ* Ġthe Ġmatching Ġcondition . Ċ Ġ* ĠThe Ġtree Ġtraversal Ġwill Ġbe Ġpre - order . Ċ Ġ*/ Ċ fun ĠNode . find Child Pre Order ( reversed : ĠBoolean , Ġcallback : ĠFilter < Node >): ĠNode ? Ġ{ Ċ ĉ return Ġchild Walk Pre order ( reversed ) Ġ{ Ċĉ ĉ if Ġ( callback ( it )) ĠTree Walk . HAL T Ġelse ĠTree Walk . CONTINUE Ċ ĉ } Ċ } Ċ Ċ fun ĠNode . find Child Pre Order ( callback : ĠFilter < Node >): ĠNode ? Ġ{ Ċ ĉ return Ġfind Child Pre Order ( reversed Ġ= Ġfalse , Ġcallback Ġ= Ġcallback ) Ċ } Ċ Ċ fun ĠNode . find Last Child Pre Order ( callback : ĠFilter < Node >): ĠNode ? Ġ{ Ċ ĉ return Ġfind Child Pre Order ( reversed Ġ= Ġtrue , Ġcallback Ġ= Ġcallback ) Ċ } ĊĊ Ċ /** Ċ Ġ* ĠStarting Ġfrom Ġthis ĠNode Ġas Ġthe Ġroot , Ġwalk s Ġdown Ġthe Ġleft Ġside Ġuntil Ġthe Ġend , Ġreturning Ġthat Ġchild . Ċ Ġ*/ Ċ fun ĠNode . left Desc endant (): ĠNode Ġ{ Ċ ĉ if Ġ( children . isEmpty ()) Ġreturn Ġthis Ċ ĉ return Ġchildren . first (). left Desc endant () Ċ } Ċ Ċ /** Ċ Ġ* ĠStarting Ġfrom Ġthis ĠNode Ġas Ġthe Ġroot , Ġwalk s Ġdown Ġthe Ġright Ġside Ġuntil Ġthe Ġend , Ġreturning Ġthat Ġchild . Ċ Ġ*/ Ċ fun ĠNode . right Desc endant (): ĠNode Ġ{ Ċ ĉ if Ġ( children . isEmpty ()) Ġreturn Ġthis Ċ ĉ return Ġchildren . last (). right Desc endant () Ċ } Ċ Ċ interface ĠNode With Parent Ġ: ĠNode Ġ{ Ċ ĉ val Ġparent : ĠNode With Parent ? Ċ } Ċ Ċ fun ĠNode With Parent . previous Sibling (): ĠNode ? Ġ{ Ċ ĉ val Ġp Ġ= Ġparent Ġ?: Ġreturn Ġnull Ċ ĉ val Ġc Ġ= Ġp . children Ċ ĉ val Ġindex Ġ= Ġc . indexOf ( this ) Ċ ĉ if Ġ( index Ġ== Ġ 0 ) Ġreturn Ġnull Ċ ĉ return Ġc [ index Ġ- Ġ 1 ] Ċ } Ċ Ċ fun ĠNode With Parent . next Sibling (): ĠNode ? Ġ{ Ċ ĉ val Ġp Ġ= Ġparent Ġ?: Ġreturn Ġnull Ċ ĉ val Ġc Ġ= Ġp . children Ċ ĉ val Ġindex Ġ= Ġc . indexOf ( this ) Ċ ĉ if Ġ( index Ġ== Ġc . last Index ) Ġreturn Ġnull Ċ ĉ return Ġc [ index Ġ+ Ġ 1 ] Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġthe Ġline age Ġcount . Ġ 0 Ġif Ġthis Ġchild Ġis Ġthe Ġroot , Ġ 1 Ġif Ġthe Ġroot Ġis Ġthe Ġparent , Ċ Ġ* Ġ 2 Ġif Ġthe Ġroot Ġis Ġthe Ġgrand parent , Ġ 3 Ġif Ġthe Ġroot Ġis Ġthe Ġgreat Ġgrand parent , Ġand Ġso Ġon . Ċ Ġ*/ Ċ fun ĠNode With Parent . ance stry Count (): ĠInt Ġ{ Ċ ĉ var Ġcount Ġ= Ġ 0 Ċ ĉ var Ġp Ġ= Ġparent Ċ ĉ while Ġ( p Ġ!= Ġnull ) Ġ{ Ċĉ ĉ count ++ Ċĉ ĉ p Ġ= Ġp . parent Ċ ĉ } Ċ ĉ return Ġcount Ċ } Ċ Ċ inline Ġfun ĠNode With Parent . ancestor Walk ( callback : Ġ( Node With Parent ) Ġ-> ĠUnit ): ĠNode ? Ġ{ Ċ ĉ var Ġp : ĠNode With Parent ? Ġ= Ġthis Ċ ĉ while Ġ( p Ġ!= Ġnull ) Ġ{ Ċĉ ĉ callback ( p ) Ċĉ ĉ p Ġ= Ġp . parent Ċ ĉ } Ċ ĉ return Ġnull Ċ } Ċ Ċ /** Ċ Ġ* ĠWalk s Ġthe Ġan ce stry Ġchain Ġon Ġthe Ġdisplay Ġgraph , Ġreturning Ġthe Ġfirst Ġelement Ġwhere Ġthe Ġpredicate Ġreturns Ġtrue . Ċ Ġ* Ċ Ġ* Ġ@ param Ġpredicate ĠThe Ġancestor Ġ( starting Ġwith Ġ` this `) Ġis Ġpassed Ġto Ġthis Ġfunction , Ġif Ġtrue Ġis Ġreturned , Ġthe Ġan ce stry Ċ Ġ* Ġwalk Ġwill Ġstop Ġand Ġthat Ġancestor Ġwill Ġbe Ġreturned . Ċ Ġ* Ġ@ return ĠReturns Ġthe Ġfirst Ġancestor Ġwhere Ġ[ predicate ] Ġreturns Ġtrue . Ċ Ġ*/ Ċ inline Ġfun ĠNode With Parent . find Ancestor ( predicate : ĠFilter < Node >): ĠNode ? Ġ{ Ċ ĉ var Ġp : ĠNode With Parent ? Ġ= Ġthis Ċ ĉ while Ġ( p Ġ!= Ġnull ) Ġ{ Ċĉ ĉ val Ġfound Ġ= Ġpredicate ( p ) Ċĉ ĉ if Ġ( found ) Ġreturn Ġp Ċĉ ĉ p Ġ= Ġp . parent Ċ ĉ } Ċ ĉ return Ġnull Ċ } ĊĊ Ċ /** Ċ Ġ* ĠWalk s Ġthe Ġan ce stry Ġchain Ġon Ġthe Ġdisplay Ġgraph , Ġreturning Ġthe Ġchild Ġof Ġthe Ġancestor Ġwhere Ġ[ predicate ] Ġreturned Ġtrue . Ċ Ġ* Ċ Ġ* Ġ@ param Ġpredicate ĠThe Ġancestor Ġ( starting Ġwith Ġ` parent `) Ġis Ġpassed Ġto Ġthis Ġfunction , Ġif Ġtrue Ġis Ġreturned , Ġthe Ġan ce stry Ċ Ġ* Ġwalk Ġwill Ġstop Ġand Ġthe Ġchild Ġof Ġthat Ġancestor Ġis Ġreturned . Ċ Ġ*/ Ċ inline Ġfun ĠNode With Parent . find Ancestor Before ( predicate : ĠFilter < Node >): ĠNode ? Ġ{ Ċ ĉ var Ġc Ġ= Ġthis Ċ ĉ var Ġp : ĠNode With Parent ? Ġ= Ġparent Ċ ĉ while Ġ( p Ġ!= Ġnull ) Ġ{ Ċĉ ĉ val Ġfound Ġ= Ġpredicate ( p ) Ċĉ ĉ if Ġ( found ) Ġreturn Ġc Ċĉ ĉ c Ġ= Ġp Ċĉ ĉ p Ġ= Ġp . parent Ċ ĉ } Ċ ĉ return Ġnull Ċ } Ċ Ċ /** Ċ Ġ* ĠPop ulates Ġan ĠArrayList Ġwith Ġa ĠChild Ro 's Ġan ce stry . Ċ Ġ* Ġ@ return ĠReturns Ġthe Ġ[ out ] ĠArrayList Ċ Ġ*/ Ċ fun ĠNode With Parent . ance stry (): ĠList < Node With Parent > Ġ{ Ċ ĉ val Ġout Ġ= ĠArrayList < Node With Parent >() Ċ ĉ ancestor Walk Ġ{ Ċĉ ĉ out . add ( it ) Ċ ĉ } Ċ ĉ return Ġout Ċ } Ċ Ċ fun ĠNode With Parent . root (): ĠNode With Parent Ġ{ Ċ ĉ var Ġroot : ĠNode With Parent Ġ= Ġthis Ċ ĉ var Ġp : ĠNode With Parent ? Ġ= Ġthis Ċ ĉ while Ġ( p Ġ!= Ġnull ) Ġ{ Ċĉ ĉ root Ġ= Ġp Ċĉ ĉ p Ġ= Ġp . parent Ċ ĉ } Ċ ĉ return Ġroot Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġthe Ġlowest Ġcommon Ġancestor Ġif Ġthere Ġis Ġone Ġbetween Ġthe Ġtwo Ġchildren . Ċ Ġ*/ Ċ fun ĠNode With Parent . lowest Common Ancestor ( other : ĠNode With Parent ): ĠNode With Parent ? Ġ{ Ċ ĉ val Ġan ce stry 1 Ġ= Ġan ce stry () Ċ ĉ val Ġan ce stry 2 Ġ= Ġother . ance stry () Ċ ĉ return Ġan ce stry 1 . first OrNull Ġ{ Ġan ce stry 2 . contains ( it ) Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġtrue Ġif Ġthis Ġnode Ġis Ġbefore Ġthe Ġ[ other ] Ġnode . ĠThis Ġcons iders Ġthe Ġparent Ġto Ġcome Ġbefore Ġthe Ġchild . Ċ Ġ* ĠReturns Ġnull Ġif Ġthere Ġis Ġno Ġcommon Ġancestor . Ċ Ġ*/ Ċ fun ĠNode With Parent . is Before ( other : ĠNode With Parent ): ĠBoolean ? Ġ{ Ċ ĉ if Ġ( this Ġ=== Ġother ) Ġthrow ĠException (" this Ġ=== Ġother ") Ċ ĉ var Ġa Ġ= Ġthis Ċ ĉ ancestor Walk Ġ{ Ġparent A Ġ-> Ċĉ ĉ var Ġb Ġ= Ġthis Ċĉ ĉ other . ancestor Walk Ġ{ Ġparent B Ġ-> Ċĉĉ ĉ if Ġ( parent A Ġ=== Ġparent B ) Ġ{ Ċĉĉĉ ĉ val Ġchildren Ġ= Ġparent A . children Ċĉĉĉ ĉ val Ġindex A Ġ= Ġchildren . indexOf ( a ) Ċĉĉĉ ĉ val Ġindex B Ġ= Ġchildren . indexOf ( b ) Ċĉĉĉ ĉ return Ġindex A Ġ< Ġindex B Ċĉĉ ĉ } Ċĉĉ ĉ b Ġ= Ġparent B Ċĉ ĉ } Ċĉ ĉ a Ġ= Ġparent A Ċ ĉ } Ċ ĉ return Ġnull Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġtrue Ġif Ġthis ĠChild Ro Ġis Ġafter Ġthe Ġ[ other ] ĠChild Ro . ĠThis Ġcons iders Ġthe Ġparent Ġto Ġcome Ġbefore Ġthe Ġchild . Ċ Ġ* Ġ@ throws ĠException ĠIf Ġ[ other ] Ġdoes Ġnot Ġhave Ġa Ġcommon Ġancestor . Ċ Ġ*/ Ċ fun ĠNode With Parent . is After ( other : ĠNode With Parent ): ĠBoolean Ġ{ Ċ ĉ if Ġ( this Ġ=== Ġother ) Ġthrow ĠException (" this Ġ=== Ġother ") Ċ ĉ var Ġa Ġ= Ġthis Ċ ĉ ancestor Walk Ġ{ Ġparent A Ġ-> Ċĉ ĉ var Ġb Ġ= Ġthis Ċĉ ĉ other . ancestor Walk Ġ{ Ġparent B Ġ-> Ċĉĉ ĉ if Ġ( parent A Ġ=== Ġparent B ) Ġ{ Ċĉĉĉ ĉ val Ġchildren Ġ= Ġparent A . children Ċĉĉĉ ĉ val Ġindex A Ġ= Ġchildren . indexOf ( a ) Ċĉĉĉ ĉ val Ġindex B Ġ= Ġchildren . indexOf ( b ) Ċĉĉĉ ĉ return Ġindex A Ġ> Ġindex B Ċĉĉ ĉ } Ċĉĉ ĉ b Ġ= Ġparent B Ċĉ ĉ } Ċĉ ĉ a Ġ= Ġparent A Ċ ĉ } Ċ ĉ throw ĠException (" No Ġcommon Ġwith Ancestor ") Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġtrue Ġif Ġthis Ġ[ Node ] Ġis Ġthe Ġancestor Ġof Ġthe Ġgiven Ġ[ child ]. Ċ Ġ* ĠX Ġis Ġconsidered Ġto Ġbe Ġan Ġancestor Ġof ĠY Ġif Ġdoing Ġa Ġparent Ġwalk Ġstarting Ġfrom ĠY , ĠX Ġis Ġthen Ġreached . Ċ Ġ* ĠThis Ġwill Ġreturn Ġtrue Ġif ĠX Ġ=== ĠY Ċ Ġ*/ Ċ fun ĠNode With Parent . is Ancestor Of ( child : ĠNode With Parent ): ĠBoolean Ġ{ Ċ ĉ return Ġchild . find Ancestor Ġ{ Ċĉ ĉ it Ġ=== Ġthis Ċ ĉ } Ġ!= Ġnull Ċ } Ċ Ċ fun ĠNode With Parent . is Desc endant Of ( ancestor : ĠNode With Parent ): ĠBoolean Ġ= Ġancestor . is Ancestor Of ( this ) Ċ