From bf987db01af7f3b2e4b303d046eb5a9653c9362e Mon Sep 17 00:00:00 2001 From: noah Date: Wed, 20 Apr 2022 16:05:20 -0500 Subject: [PATCH] Switching Left and Right rotates in cleanup when parent is the right child of the grandparent --- .../CMakeFiles/RBlib.dir/src/Red-Black.cpp.o | Bin 12880 -> 12848 bytes build/CMakeFiles/main.dir/src/main.cpp.o | Bin 9984 -> 9088 bytes build/libRBlib.a | Bin 13286 -> 13254 bytes build/main | Bin 28216 -> 28216 bytes src/Red-Black.cpp | 75 ++++++++++++++++-- src/Red-Black.h | 3 +- src/main.cpp | 41 +++++++++- 7 files changed, 112 insertions(+), 7 deletions(-) diff --git a/build/CMakeFiles/RBlib.dir/src/Red-Black.cpp.o b/build/CMakeFiles/RBlib.dir/src/Red-Black.cpp.o index 07b5d9c0ab40786554c0e1ab82b32761132ab1a5..b5d0f72bf3d2b4b3ef83170b0d85c689507a5a42 100644 GIT binary patch delta 1251 zcmZ`&OK1~O6rG!XQti}4i@pw`HZ^IJu}w1~7EwDEH}Qj1L_x$wX_YFd)P)~Zuo#8n z!j=Q#MnxBD1wSSJK#|tZqSA%BP+W)z{;HxzH${u}zS{=g#s}}r;hcNVeQ%g~+IGFI zJ0AE^+vnaZq6PR^bg=NMWm)J7E)9Iyg$u=1vsS0O-h5)sTCwO+DD#0yUPyO6#{A+G zDuYGop}%8edHu);g^u1e1TIV;?GI%xiuPU7(u*F3GS^H&SF~YAu!2_MSa2(KXTJuQ z6lSaKTSPOnuglgEtMJV){O$onq~#8Ot!Q9>=Zf=FQVw0 zMl@I17>d~R06h`qyeJ;;DC9>a@6oaG^-;U@2RTL?Z>to|5{zN$Tt$n~!MI$MX5pI! zx8NM>`!qVoCXS?&T_gDlo^j26!6%aNQt&;zsG)#HrtrsTVg6kB zYpMAxI3hI#h{P3zk>i@#=wqG`WuYid8l5$h`5L_R+nmii|28+FGp?Mi|8YBXnzR2u zZbtXg37K^k13dk*@LO_*hoZcYgm)7O0iGN-rhmb?gmQiv`Q?WDTf0<=XN)nBtIFz1 z+2*BhQH?TJVTo%yzM;n0$=_`wT3qF{814eYZATBgyC+NOTgp zdCJL5d=#U^b-eUt^j@Eh)Se(Zguc3lN%0D8Synf4bq#^RQuIxkfn~{f(V!lLo>Vyw zC*w4T-lQKGDaGexBi}Gl?-wkyEqLMSI9wm6JLs+V(OzGP#&8M3sS0|EM9QaTY)kop rR$Eg0Q*mm?Fw3Wq@ch6h7u&r?x`bZOCkw-#KdGcv4rB4(m7Mbr)zFHj delta 1406 zcmZ`(T}TvB6rMAzuA6J?w%~1gsP$)cTy=ja5UCvZq1dg6{-C0Vlq>=hw5NWg5?x{* zvgFW150OPg1%b6f1YwCu8cB%-LQz?SL6B_}^kCV!$6dNFUbx?!`+etp=giK`_BX$5 zzF_KwHFtv#bHKuxoDRnWP1Ep{bG`oc1m4IkIlVh>zyCsP9>#?W%Hj@j^ z@w#D8_jQ#>QpVnS>66LG%*1{Tc+z<&_0hS`k@C9-0LoLZ3w8qRPgQz64k*VuUj_7G zlTScT>bUR9Qn-xXVgYwBT2hJ~#cpFHSKgPVIcNuI&rv72#$}!{t*CxQ{lPA|I8-7) zFq(`JOcS#ax0edo%FI5F4>Pu5C-Gepjb10&(UN_`w6lHh<6X)bWqidB(~Ps|Efa>G zCuixu+6{QMOu!DtMx3C`RwXl}_#9)Oq@t=mH!&Iz z#(<($D78b_6cF%S&IzAnCd|r?I2CZ?k$~ICbx|@c`Fj-8&fZxOrYX0SF@nYA0%D8_ z+)nW><{O!5<@gN8=UBbS%r%bhp|?W7BaUBSjN-Q(&v4F9Mjg|pfC2=<6*xgTCiYUi znwbV>HcK@2ERnM=OuLe<*=Y}AlPQe0Mbwkh&FET0?UA)`iF@7RNd`E6%rlHL^MM_{ zWgK+sT&Q&ag`Jfm@kjCZDXJr%4zy&|GTPahgNyKCoURl`ZAO*PrCh0sp*JXugrWu% z^#I05ZBf)Uih2~=N$tp}K~icJwG*!fE9eUz3p#LuSsTY=rF*A2xAD-Ah3e_~y22KY zhW&Ur?1w3|!xn7AF~aZYide7*6A?>qakE!n#Dq2+Bf1Y=QA^LO!cEb7=tnzhK^~4p PEtgr%BWRz|8(Q@b?Dx~R diff --git a/build/CMakeFiles/main.dir/src/main.cpp.o b/build/CMakeFiles/main.dir/src/main.cpp.o index dab0bb341efb51c2e33a1c9c158f3075b9ea0833..fd56bd5de50748c6858cd98d8b150ce112ca91b6 100644 GIT binary patch delta 1818 zcmZ`)UuYaf9Nw8^?{3rG(EFF!-QI<}+xrtzV+m>^w!KCalNPL0(1&0i3RMH;AOQuT zXit2x&}iZFrB%Tw+7?ZV6GldU&jPuOAWEmIOhnxnj zF7r>z_^a!eE*e~mJMZ@xYjN`*%V;LvVKn&NLNk%Y$;55mZ{jVh!cTYObL&4j`n2a~ ze6c0vy!jKK%e@3vXo;_HPUmTOrdTPd~`*xIBr2wqWBj z;&QnghwKb{O<@nIcm%)MHLIUiEZcd7T~z9Vf}hOrfICo-7reSYzJ?>D?=7_YXg8Qs+P)9>DTyUl8N0Sn0;tcX@p z;H#wV9M`x2PD(gsEprJhB`}e)y{d+`v>XqOl=SeD*e8W=rIWNlo_+K$KDo6%l%Bdhi)8=c9cnuhjEY3^^( zJQvXn^$F#ESVIRe6{5#Aw1&ApS#!BBTJyA~32>L#g0`}YbhKnsrwDnW_D@6|ZfY9Z zKM_4O48yL#l8By~sx%CJJ+zds<3@d-(lh~flglpGW`{5@1m1AV@|?NiXo*}pXZxt0 zq2b3gJfq>*1iz}`SxtXa!$Y5#`l?!35n}IMjn>oFH^Hs&Mv$~VEg$nfZAHk+_ak?> zv&ccr`eOI6#%|ZxogqF**pP;gX|*24R8DyM497_+o1BSdsKQ1c|HE z`DbyuVf!#s8Q^D#C*)VkrS7r^zgo}U2>%VH!J%-(zLZuT*`Np6zeWRu-I%%hUjNVkR*TC1((hoXU?5o235wgDAI zYT^&2KN_h${Sj6IR(z03XhYD}YN1-eKh+{t8lzhR64XM}7KGX=@yy(t^lTsld*+_+ zJLj7-XYSq^+cviAa7H^Sn86M@M@%TVCe(Jmq6-f6Yyuo#4Lrb#{ust)Wx!_`cTJub#^u zbS?zUzjbya;QLW$W5M4wbiUMm&{J6kZv}qQync8wnAXO9Fd4ihy?n{{o(-%UMndtX z4QxABL`T1JLKITZkHKpp;lUlj7pXX(g_)4>T|y=d-vy)mC+Swolo8%D$>>r?RiZF}vvK=E8iI_8*mI)3&sp+jv1!q9*ncAmY7r>hzX1K^)3>V zhH({hc1_HKMKMb;q12xtXd~Eh2R%g4EbNTSH4ns#*Zh#gq+uG_6xq=k&+W6Qfr3&n z6U7QYkQnS&LYVZe;E)soUP>4ieH-d!8*s>}0wxo(vTrbxcB2;t6WBk2{S$`yB+1A^ zi%|U&#TlbAW(j-6 z#bqT1!50ZmE4fN^>PY-`S;^=>B&(FL3_q4~$W^GC&&6dLRWk{mMsB4)g5V7V&pP<1 zIxM>Rjq4=rAUJJDpNp?;$0G!%8yFxubqqhkE0qorB26mYNALu}UtR~FA-Ev%pAmdj zXB5AE=Lunxgi8dcLW}F*e-eCk0n}&iMIeu?iRcFr-;2IFV-F$1B%zt$!o_8)TL_+X zae0ib1g|GLZBQr^Cf&w1_3bXR3@b`<9>QliWU-a7*%B7r${xiztPR7KXs<$KS%=o=V8$blMN|RXKhYtm-Y=SS9pV z=QIdF9;bH#FkhW3`6J+{J`Bm4E^TWN`fGC9!64*u3fnM`)8QbLCv#fHhJKtTki+St zptF23qn$)PmD3h57pHq|$ft7gxe`ZrLN*eIyipRclxiy3e}@8?fMji#_8Y3!*8dMN C7Rs^! diff --git a/build/libRBlib.a b/build/libRBlib.a index f7efcf6f276f5a7e7511c47327452e1c51a560ec..f6f0fcfaf17705516cb488ead0b7ce8f13afe869 100644 GIT binary patch delta 1170 zcmZ`&O-vI(6y6zXcekx92i#=~g(AhG6kA%f5Rlb)u>Qn&5u?U~L4lKh2Y;dnk)k0+ zA-sfe65~M$iBi)DCK5|PM2v~V1H>4E2SFkSiC%~j>g+s7niw~k`TBkDdvD&n-Okm& zu8-Xzw5%N3iJva|;=^QU9VvrG@tWm{APA5r@1P53p-S55IuL1_nP-}?x8ju&ont@N zgh<;Myb%L+k=9R2^xaA_xfWKrCEA}Vn2u9Pv&^ca zZJaxKx&4qM*O89+4Y|q^A6h>^Xf}nI;*8%_$_Y6fAJ0%MBpaqPy`&40nHq`4wGBP# z^nn!?^HtIh?+XgxSfPWCSfM#jrBh7LR_Qlnf2${9cXf5)88g zJrcNCqooo*zEXlor%EFnoHdeJ<=;BB5`1AfXE60DrrwiyLw%BYIejoCHN;A+wJ^fZ z{)paLJm%+ryvyiv$b4Kn!X}w_7)CH;KAC+Ot3k0A*+pb6Xt|AIH?m%t-{2XtF`19z z1G3NP{4T?Nw?@#IX5&-Ju<=%MZQQ>Z#qB8WLO5vS{T;XQ#_Eur$Al}$q8Mw(^d1{; zr4QKvI!95Q;*5NSykd_uP)*#B2pD81 zB-#EPj8X$u0&YlWU+BZqEHViRrd(&t8Z4)^4qmAySVS72DQJ*xNCXW!zoj!&O?try O8AO04wo8x*dH(`~TWTc$ delta 1230 zcmZ`&T}TvB6rOuCcV<@`i<)UATiHc-@o#5$sZ|n3ABvSEqJoT|U5GRiL3)xhG~6Zj zK^Hqj^bkt)U_r37Vgz9;X7!L5*h5hGLy$eW76lQe-FwfbOVGgFZ@zQB^W8IN=DuwI z+@2gDwAO$G@zSE|RGK{7PE5FF=^;#is zicg2)udIDX9S-hf?#1NKHrj!Z} z5k%)u-IN-=pBsoV#hDH6lT~DU5`K-aQ)x?eEA@G)@xn1e%2OTcNkYP@=S6BBDTmqJ zZu^LZw=PL52-4U#N!le*X)vYk8Qwwf=7ZtT=%ajyI5n7e6~HBD0hxw`Q>QbSTVmkU z=r?5f78u#DQ60g9U|59Yh=se*V;DS(>>@%Jldz5Y5r!;q+@+Bx5H8cnYrfKVShXae zIFoHVkG1V*_Zpi4zo^W&Acdg1b?TDgE$gL5hE-;LNTldt`6eSL_*xv1@vZ-L>6D?g zRHNNk7{kI*24xx@llcqUCv!>zISsrKJAXoLM(ncoA8EcK3^hee%!ObmyuBu|HY;K# zr!W%{u}&m?f()SG7RK%&d#s4&pCg-9#0)+nTSnz~1Zow^LaUfhu~qcpv5JBK1{*PW z6rt71o4a5YZFLE973KYc3}WUE);>V{F=S~J&R}p+FtP$06*~Q4h4em+{$@hEM)Pcf zRS2+qZCjtnl{4ocBr0{e41rRYBhzEuZ6VCZcVcjSt@4?|SVcsW0o3ECv!m!UIt+3!TX-9!@ jIq3J0E(rTgG6KVXlggE_=x-oNa0E;uLzu11G2s3Kly`9# diff --git a/build/main b/build/main index 6b9b9d2f9ab98c9d1c0b839ebcc10e92b7bc846c..4b9f9ed2ac52baeb9a06ea7e8973a12bb8734014 100755 GIT binary patch delta 5076 zcmZ`-3s_WT8b0SRBNs1R6ypx+AcNqjI4BoKMY$Y|j07~yOBXXmOSjk}E5{X0$8lQq zcYWG&lWombyI9c$(a=K0T%R^Kvt1*pH2e{C5H-<9n|;6koI#s?_B;=~|M&ji?f=eq z{{PIWYnJPp<@W;QpwL)JT%oZnOtu6z1ZZMIZJ|6u4qZG+6MK+36wiR2=Ns1)U$5CV zrE}ko>o2xhyEcaWsdlU1dV{?)Nz)&sf%I)JNeYwtNoUO(p?jBd{UvEI_%NN{sp}um z^&hlqgi+^5%bNbwaT@Wl&Zq18OEvuz$)HdC1(p=JQxCAmPn(F*4VGKkzXB{#m3kbn znOir@va+bae0!Bo8ZSeSye{@J>xbnK-=RnIx=YaciKDdW#}y5C=~;}iXmYg9|KwfH zaKTTK4r}vLmF{TTNR7Ct^EZ(%)zP=^dv!jH4GM}6i-SbhKlJp^n%T40M-E~cB!_bJ^wdhA&~r5mVM ze4k!A9VBV)+{YeY^2FSyDj#~Xa_-#P{k{JjnAVh}1$lY4h5;H#p}Nx=AO7uZwl3Tf zxmI6VozL`3wa3FJ^zHL2Qd3>en?m?uBa0bgi}*f7l8PMX_!{J2~V8BNrM7ottFsX^VgT0e8 z?l43Y{!VZ2j7^vg)690Vqo$0wRi6RHKA2Z>7>vfMubu@9) zbrxctGG+mZSYZNx0=;2I4h#v*YF%<(qEiHW%kS)eUFy$mR9BFn9Hu2t~%rJT!FkFmmE( zQXPIpu2gf8V^N5@`a)%I)p5Sa(aH_oY(?^Te-k;5?`DUR*DDWQVTBBpVzZ%L=s4sx*hIe2AKRf!D;ScYIx9^hi*Ro?fx1I; zk*@jNRkkoS#lHLs5*x+Wke#DZD|ZEiwqI^h*lXNI=FVOXQ~=1H;*pNS?VnLB22;At z{chJ_DN&;2dPP4QaK|l~1XpyovanU4>-WGT>pwh6S$lAJy28qbr`ZeOV?$19 zSxKSers}w?B8TnR&(I_kbekAr8))G>#L&&x6Rti`*`GSmE=Y9ZX}(enTlm8QVdCaX zbn0G0m<%I7lLXns=^Ruu3mPk}#17Y3)p3!J$FSW{=twou69PB1-(rH);xK$*cFwFu z5@?$ikHJMA!tS&5x1SY+Nc?Lt6p6Qrp_|hI+mm>$AVuQ)#IS{L6(|zlsZ$O@Z{p7j zvWZs_X6kuArjeBQay!PqNnD#0iQkX8p2SDrHp(TNuX4)h4ye@~0fmlRg^nw97y1dM zMuZPuZAGJs&MtJmAaOd#)#`%*8 zGY?i)3P;3z1ExVd0CpAzQ^%JyCGs$+VTli*N?;MIF|LYztHaMX6yn}T!mH^?xvF?iK( zo!CqSY0T5N-D=^wiLddxyBiZd$v6zPGe>&`zSqiRBxRf-L8dt4p^^k-RUF95W&uYbN)VphO;_Y*qE{N zzdo;NN8h1+N}T?-wG_FUyggDDqq>Y{oKLDV<|}bGXQEZf&EJIm=aj3KMhh<|boz4wKS>f0~7U^Qx!d*bh z$_V_QtlIZe1I*;?Kvq=LYw%Hz*DqRoBn~%Z`xeT}cW|a=?o5uxbWZTcw^YAzrd-EQ z*w8EJguNP>iciB8c5$OiIob^|ws+DcYj`tr+Oj;}3mz|<4>c!f!$Be&q zR>bZFbG;_*Khv;*v${ZN}N%7sHFiXT3(2Fr*7rDpxM3+on84#dk61;bU8Tg2Au)4w>Q>aif}8N zCN{A%6BA{L8FOmcft-KaKm6X~NyUSZ+v4#I0NQ@=c#Z)dK+X}kVXJ_pkaqyr1B+1$ zEBGp4F>nQN9_azAfaB4S$AAVrLN|d&fvI?vZpEgs0C?h}$Fm*y#wCxZ(+^wxml*WH zN;`oGz$-v2@CHx?N?jh$ET93n6c_+p1?&S9zafEdLyiC*0LB1gu#Zo~JMAnWy=$KU z{}Ye{@kS#qdD%2cu3}pzheeuCd#FQD1b^xq$%H@p6|{nVHaST)v$n~D2i}U2r0D2A z{s9|M1p4JnO87~bJE7M?n8z8}{M$VFVm_#Xn!!20Hu7%R}kn5rNybo6cZn2NU55djx;f{bS_OWdSw;nH*%k%_C0?|2A z7r2ilwz9yYba${13dSqVmswXqYTD)?X}4_LA1Hkyzp6m^-p}}BpmfgfTR#ZL{QLef zNb2@CUJjI21XRlqngeT#)ePgN$b?ZfdbPYij=evI-_F*87whxhU%@Z2J@?F&4YiR| zM;Mf*BsOJQz7lF>o2JcC@O!xn(%Ax*Rbr7BvxOxEvVpx{@{EEHBEw28QNABOBs?wj z;bWGSJy~i|@L}Qg()=mAa3s=oSObZkInwg|+OiNleZBDgs&fN&q`%M1(#oa=dOu%y zSWd6ISWQ`i(wW3QFSE!s>{8iXN|lubO`oH5npws4d^wE0KV3_A2Dl`)ZiYp{$DVq? zQY$+@<7xWd@$mg~(tJNqq@f8ZsP8u!Rp%eHvab8Z5(k%CqL$*lfiCY7+jK2_EvYEC zC>>_@3SiY_e={{_;^4EX>6 delta 5350 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 diff --git a/src/Red-Black.cpp b/src/Red-Black.cpp index 92991a9..e93b635 100644 --- a/src/Red-Black.cpp +++ b/src/Red-Black.cpp @@ -42,13 +42,17 @@ void RB::ins(Node* node, Node* newnode){ this -> ins(node -> get_rchild(), newnode); } + this -> cleanup(newnode); +} + +void RB::cleanup(Node* newnode){ Node* p = newnode -> get_parent(); Node* gp; while ((p != nullptr) && (p -> get_color() == red)){ gp = p -> get_parent(); if (gp == nullptr) - return; + break; if (p == (gp -> get_lchild())){ //Case 1: if (gp -> get_rchild() != nullptr && gp -> get_rchild() -> get_color() == red){ @@ -93,16 +97,18 @@ void RB::ins(Node* node, Node* newnode){ else if(newnode == p -> get_lchild()){ newnode = p; p = newnode -> get_parent(); - left_rot(newnode); + //left_rot(newnode); + right_rot(newnode); } //Case 3 else{ - p = newnode -> get_parent(); + //p = newnode -> get_parent(); gp = p -> get_parent(); p -> set_color(black); gp -> set_color(red); - right_rot(gp); + //right_rot(gp); + left_rot(gp); p = newnode -> get_parent(); } } @@ -110,7 +116,66 @@ void RB::ins(Node* node, Node* newnode){ this -> get_root() -> set_color(black); } -void RB::del(int key){ +void RB::del(Node* node, int key){ + if (key < node -> get_key()) + del(node -> get_lchild(), key); + else if (key > node -> get_key()) + del(node -> get_rchild(), key); + else if (key == node -> get_key()){ + //Case 1: No children + if (node -> get_lchild() == nullptr && node -> get_rchild() == nullptr){ + if (node -> get_parent() -> get_lchild() == node){ + Node* p = node -> get_parent(); + p -> set_lchild(nullptr); + node = p; + } + else{ + Node* p = node -> get_parent(); + p -> set_rchild(nullptr); + node = p; + } + } + //Case 2: No rchild + else if (node -> get_lchild() != nullptr && node -> get_rchild() == nullptr){ + Node* p = node -> get_parent(); + if (p -> get_lchild() == node){ + node = node -> get_lchild(); + p -> set_lchild(node); + node -> set_parent(p); + } + else{ + node = node -> get_lchild(); + p -> set_rchild(node); + node -> set_parent(p); + } + } + //Case 3: Get successor + else{ + Node* rtree = node -> get_rchild(); + Node* p = node -> get_parent(); + Node* l = node -> get_lchild(); + Node* r = node -> get_rchild(); + + bool left = (p -> get_lchild() == node); + while(node -> get_lchild() != nullptr){ + node = node -> get_lchild(); + } + if (node -> get_rchild() != nullptr){ + node -> get_parent() -> set_lchild(node -> get_rchild()); + } node -> get_rchild() -> set_parent(node -> get_parent()); + + left ? p -> set_lchild(node) : p -> set_rchild(node); + node -> set_parent(p); + node -> set_lchild(l); + node -> set_rchild(r); + } + } + else{ + std::cout << "Node does not exist in the tree" << std::endl; + return; + } + + this -> cleanup(node); } diff --git a/src/Red-Black.h b/src/Red-Black.h index 903bc1d..fb269a6 100644 --- a/src/Red-Black.h +++ b/src/Red-Black.h @@ -24,12 +24,13 @@ class RB RB(); void ins(Node* node, Node* newnode); - void del(int key); + void del(Node* node, int key); void display(Node* node, Trunk* prev, bool left); Node* get_root(); void right_rot(Node* node); void left_rot(Node* node); + void cleanup(Node* newnode); private: Node* root; diff --git a/src/main.cpp b/src/main.cpp index 341ae71..602a77c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -16,9 +16,48 @@ int main(int argc, char *argv[]) tree.ins(tree.get_root(), newnode); } - std::cout << "After insertion" << std::endl; + std::cout << "After insertion:" << std::endl; tree.display(tree.get_root(), nullptr, false); + std::cout << "" << std::endl; + std::cout << "Deleting 12:" << std::endl; + tree.del(tree.get_root(), 12); + tree.display(tree.get_root(), nullptr, false); + std::cout << "" << std::endl; + + std::cout << "Inserting 32:" << std::endl; + Node* newnode = new Node(32); + tree.ins(tree.get_root(), newnode); + tree.display(tree.get_root(), nullptr, false); + std::cout << "" << std::endl; + + std::cout << "Deleting 41:" << std::endl; + tree.del(tree.get_root(), 41); + tree.display(tree.get_root(), nullptr, false); + std::cout << "" << std::endl; + + RB tree2 = RB(); std::vector insert_new {834, 807, 512, 882, 127, 675, 75, 216, 822, 249, 114, 689, 625, 974, 221, 92, 374, 123, 838, 930, 654, 806, 234, 381}; + + std::cout << "Inserting initial keys from Part c..." << std::endl; + for (int k : insert_new){ + Node* newnode = new Node(k); + tree2.ins(tree2.get_root(), newnode); + } + + std::cout << "After insertion:" << std::endl; + tree2.display(tree2.get_root(), nullptr, false); + std::cout << "" << std::endl; + /* + std::cout << "Deleting 127:" << std::endl; + tree2.del(tree2.get_root(), 127); + tree2.display(tree2.get_root(), nullptr, false); + std::cout << "" << std::endl; + + std::cout << "Deleting 221:" << std::endl; + tree2.del(tree2.get_root(), 221); + tree2.display(tree2.get_root(), nullptr, false); + std::cout << "" << std::endl; + */ } \ No newline at end of file