Project2.pdf

‫ﺑﻪ ﻧﺎم اﻳﺰد ﻣﻨﺎن‬
‫درس داده ﺳﺎﺧﺘﺎرﻫﺎ و اﻟﮕﻮرﻳﺘﻢ ﻫﺎ‬
‫ﺗﻤﺮﻳﻦ ﻋﻤﻠﻲ ﺷﻤﺎره دوم‬
‫ﻣﻮﻋﺪ ﺗﺤﻮﻳﻞ ‪89/9/22 :‬‬
‫__________________________________________________________________‬
‫ﻓﺎﻳﻞ ﻫﺎي ﻻزم ﺑﺮاي اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﻣﺮﺑﻮط ﺑﻪ ﻫﺮ ﺳﻮال را در ﭘﻮﺷﻪ اي ﻣﺠﺰا ﺑﻪ ﻧﺎم ﺷﻤﺎره ﺳﻮال ﺑﻪ ﺻﻮرت ﻋﺪدي‬
‫ﻗﺮار دﻫﻴﺪ‪ ،‬اﻳﻦ ﭘﻮﺷﻪ ﻫﺎ را در ﻳﻚ ﭘﻮﺷﻪ ﺑﺎ ﻧﺎم ‪ stdID_Project2‬ﻛﻪ ﺑﻪ ﺟﺎي ‪ stdID‬ﺷﻤﺎره داﻧﺸﺠﻮﻳﻲ ﺧﻮد را‬
‫ﻗﺮار ﻣﻴﺪﻫﻴﺪ ﺑﮕﺬارﻳﺪ‪ ،‬اﻳﻦ ﭘﻮﺷﻪ را ﻓﺸﺮده ﻛﺮده و ﺗﺎ ﻗﺒﻞ از ﺳﺎﻋﺖ ‪ 12‬ﻧﻴﻤﻪ ﻧﻴﻤﻪ ﺷﺐ ﻣﻮﻋﺪ ﺗﺤﻮﻳﻞ ﻣﺬﻛﻮر ﺑﻪ‬
‫آدرس ‪ [email protected]‬ارﺳﺎل ﻛﻨﻴﺪ‪ .‬ﻋﻨﻮان اﻳﻤﻴﻞ ﻫﺎن ﻧﺎم ﻓﺎﻳﻞ ﺿﻤﻴﻤﻪ ﺷﺪه ﺑﺎﺷﺪ‪.‬‬
‫در ﺻﻮرت وﺟﻮد ﻫﺮﮔﻮﻧﻪ اﺑﻬﺎم ﻳﺎ ﭘﺮﺳﺸﻲ در ﻣﻮرد ﺳﻮاﻻت ﺑﻪ آدرس ‪ [email protected]‬اﻳﻤﻴﻞ ﺑﺰﻧﻴﺪ‪.‬‬
‫__________________________________________________________________‬
‫ﺳﻮال اول‪ :‬درﺧﺖ دو ﺑﻌﺪي )‪(2d-tree‬‬
‫ﻫﺪف اﻳﻦ ﺳﻮال ﻃﺮاﺣﻲ و ﭘﻴﺎده ﺳﺎزي داده ﺳﺎﺧﺘﺎر درﺧﺖ ‪ 2‬ﺑﻌﺪي و اﻟﮕﻮرﻳﺘﻢ ﻫﺎي ﻣﺮﺑﻮط ﺑﻪ آن اﺳﺖ‪.‬‬
‫ﻣﻘﺪﻣﻪ‪:‬‬
‫درﺧﺖ ‪ 2‬ﺑﻌﺪي از اﻧﻮاع درﺧﺖ ﻫﺎي ‪k) kd-tree‬ﺑﻌﺪي( اﺳﺖ و ﻫﻤﺎﻧﻄﻮر ﻛﻪ از ﻧﺎم آن ﺑﺮﻣﻴ‪Ĥ‬ﻳﺪ‪ ،‬ﮔﺮه ﻫﺎي آن‬
‫ﻣﻮﺟﻮدﻳﺖ ﻫﺎﻳﻲ ﺑﺎ دو ﻛﻠﻴﺪ ﻫﺴﺘﻨﺪ ﻛﻪ ﻛﻠﻴﺪﻫﺎي ﻣﺬﻛﻮر‪ ،‬ﻣﺨﺘﺼﺎت ‪ x‬و ‪ y‬ﻳﻚ ﻧﻘﻄﻪ در ﺻﻔﺤﻪ ﻣﻴﺒﺎﺷﻨﺪ‪ .‬اﻳﻦ‬
‫درﺧﺖ ﻧﻴﺰ ﺳﺎﺧﺘﺎر درﺧﺖ دودوﻳﻲ ﺟﺴﺘﺠﻮ را دارد و ﻋﻤﻠﻴﺎت درج و ﺟﺴﺘﺠﻮ روي آن ﺗﺎ ﺣﺪ زﻳﺎدي ﺷﺒﻴﻪ ‪BST‬‬
‫اﺳﺖ‪ .‬ﻋﻤﺪه ﺗﺮﻳﻦ ﻛﺎرﺑﺮد اﻳﻦ ﻧﻮع درﺧﺖ ﻫﺎ ﺑﺮاي ﺗﻘﺴﻴﻢ ﻓﻀﺎﻫﺎي ‪ 2‬ﺑﻌﺪي اﺳﺖ و ﺳﺎﺧﺘﺎر ﺧﺎص آﻧﻬﺎ اﻣﻜﺎن‬
‫ﺟﺴﺘﺠﻮي ﺧﺎص ﻣﻨﻈﻮره ي ﺑﺎزه اي و ﻳﺎﻓﺘﻦ ﻧﺰدﻳﻚ ﺗﺮﻳﻦ ﻧﻘﻄﻪ ﺑﻪ ﻳﻚ ﻧﻘﻄﻪ را ﺑﺎ ﻣﺮﺗﺒﻪ ارﺗﻔﺎع درﺧﺖ ﻣﻴﺴﺮ‬
‫ﻣﻴﻜﻨﺪ‪.‬‬
‫ﺻﻮرت ﻣﺴﺎﻟﻪ‪:‬‬
‫در اﻳﻦ ﺗﻤﺮﻳﻦ ﺷﻤﺎ ﺑﺎﻳﺪ داده ﺳﺎﺧﺘﺎر ﻣﺬﻛﻮر را ﺑﻪ ﻫﻤﺮاه ﺗﻮاﺑﻊ ﻻزم ﺑﺮاي درج و ﺣﺬف و ﺟﺴﺘﺠﻮي ﻋﻨﺼﺮ‪،‬‬
‫ﺟﺴﺘﺠﻮي ﺑﺎزه اي و ﻳﺎﻓﺘﻦ ﻧﺰدﻳﻚ ﺗﺮﻳﻦ ﻧﻘﻄﻪ ﭘﻴﺎده ﺳﺎزي ﻛﻨﻴﺪ‪ ،‬ﺳﭙﺲ ﺑﺎ ﺧﻮاﻧﺪن دﺳﺘﻮراﺗﻲ ﺑﺎ ﻗﺎﻟﺐ ﻣﺸﺨﺺ از‬
‫ورودي اﺳﺘﺎﻧﺪارد ﻋﻤﻠﻴﺎت ﻣﻮرد ﻧﻈﺮ را روي درﺧﺖ اﻧﺠﺎم دﻫﻴﺪ و ﺧﺮوﺟﻲ آن ﻋﻤﻞ را در ﺻﻮرت وﺟﻮد در ﺧﺮوﺟﻲ‬
‫اﺳﺘﺎﻧﺪارد ﺑﻨﻮﻳﺴﻴﺪ‪ .‬ﻣﻨﻈﻮر از ﻋﻨﺼﺮ‪ ،‬ﻧﻘﺎط ﺻﻔﺤﻪ ﻫﺴﺘﻨﺪ و ﺑﺮاي اﻳﻦ ﺳﻮال ﻓﺮض ﻣﻴﺸﻮد ﻛﻪ ﻧﻘﺎﻃﻲ ﻛﻪ ﺑﺎ آﻧﻬﺎ ﻛﺎر‬
‫ﺧﻮاﻫﻴﺪ ﻛﺮد ﻫﻤﮕﻲ داﺧﻞ ﻣﺮﺑﻊ واﺣﺪ ﻣﺤﻮرﻫﺎي ﻣﺨﺘﺼﺎت و ﺑﺎ دﻗﺖ دو رﻗﻢ اﻋﺸﺎر ﻗﺮار دارﻧﺪ‪).‬ﺑﻨﺎﺑﺮاﻳﻦ ‪ x‬و ‪ y‬ﺑﻴﻦ‬
‫‪ 0‬و ‪ 1‬و ﺑﻪ ﺻﻮرت ‪ 0.dd‬ﺧﻮاﻫﻨﺪ ﺑﻮد ﻛﻪ ‪ (0=<d<=9‬ﺑﺎ ﻋﻨﺎﻳﺖ ﺑﻪ اﻳﻨﻜﻪ ﻋﻤﻠﻴﺎت درج و ﺟﺴﺘﺠﻮ در اﻳﻦ ﻧﻮع‬
‫درﺧﺖ ﻫﺎ اﻧﺪﻛﻲ ﺑﺎ د‪.‬د‪.‬ج ﺗﻔﺎوت دارد‪ ،‬ﺷﺮح ﻣﺨﺘﺼﺮي از ﭼﮕﻮﻧﮕﻲ اﻳﻦ اﻋﻤﺎل و ﺧﺮوﺟﻲ ﻫﺎي ﺷﻤﺎ در زﻳﺮ آﻣﺪه‬
‫اﺳﺖ‪:1‬‬
‫درج‪:‬‬
‫ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻗﺒﻼً ﮔﻔﺘﻴﻢ در اﻳﻦ درﺧﺖ‪ ،‬ﻫﺮ ﻋﻨﺼﺮ ‪ 2‬ﻛﻠﻴﺪ دارد ﻟﺬا ﺑﺮاي درج در ﻫﺮ ﻣﺮﺣﻠﻪ از ﻳﻜﻲ از اﻳﻦ دو ﺑﺮاي‬
‫ﻣﻘﺎﻳﺴﻪ اﺳﺘﻔﺎده ﻣﻴﺸﻮد ﺑﺪﻳﻦ ﺻﻮرت ﻛﻪ ﻫﻨﮕﺎم درج ﻳﻚ ﻋﻨﺼﺮ از رﻳﺸﻪ ﺷﺮوع ﻣﻴﻜﻨﻴﻢ و ﻣﺨﺘﺼﺎت ‪ x‬ﻋﻨﺼﺮ را ﺑﺎ‬
‫ﻣﺨﺘﺼﺎت ‪ x‬رﻳﺸﻪ ﻣﻘﺎﻳﺴﻪ ﻣﻴﻜﻨﻴﻢ و ﻣﺎﻧﻨﺪ د‪.‬د‪.‬ج اﮔﺮ ‪ x‬ﻋﻨﺼﺮ ﻛﻮﭼﻜﺘﺮ ﺑﻮد ﺑﻪ ﭼﭗ و در ﻏﻴﺮاﻳﻨﺼﻮرت ﺑﻪ راﺳﺖ‬
‫ﻣﻴﺮوﻳﻢ‪ ،‬ﺳﭙﺲ در اﻳﻦ ﻣﺮﺣﻠﻪ ﻣﺨﺘﺼﺎت ‪ y‬ﻋﻨﺼﺮ را ﺑﺎ ﻣﺨﺘﺼﺎت ‪ y‬ﮔﺮﻫﻲ ﻛﻪ روي آن ﻗﺮار دارﻳﻢ ﻣﻘﺎﻳﺴﻪ ﻣﻴﻜﻨﻴﻢ و‬
‫ﻣﺎﻧﻨﺪ ﺑﺎﻻ اﮔﺮ ‪ y‬ﻋﻨﺼﺮ ﻛﻮﭼﻜﺘﺮ ﺑﻮد ﺑﻪ ﭼﭗ و در ﻏﻴﺮاﻳﻨﺼﻮرت ﺑﻪ راﺳﺖ ﻣﻴﺮﻳﻢ‪ ،‬در ﻣﺮﺣﻠﻪ ﺑﻌﺪ دوﺑﺎره ‪x‬ﻫﺎ را‬
‫ﻣﻘﺎﻳﺴﻪ ﻣﻴﻜﻨﻴﻢ و ﻫﻤﻴﻨﻄﻮر ﺑﻴﻦ اﻳﻦ دو ﺣﺎﻟﺖ اداﻣﻪ ﻣﻴﺪﻫﻴﻢ ﺗﺎ ﺑﻪ ﺑﺮگ ﺑﺮﺳﻴﻢ و ﻋﻨﺼﺮ را در آﻧﺠﺎ ﻗﺮار دﻫﻴﻢ‪.‬‬
‫ﺣﺘﻤﺎً ﻣﺘﻮﺟﻪ ﺷﺪه اﻳﺪ ﻛﻪ ﺑﺮاي ﭘﻴﺎده ﺳﺎزي ﭼﻴﻦ درﺧﺘﻲ ﺑﺎﻳﺪ از ﺳﺎﺧﺘﺎر درﺧﺖ ﻗﺮﻣﺰ و ﺳﻴﺎه اﺳﺘﻔﺎده ﻛﻨﻴﺪ و ﻣﺜﻼً‬
‫در ﮔﺮه ﻫﺎي ﻗﺮﻣﺰ‪x ،‬ﻫﺎ را ﻣﻘﺎﻳﺴﻪ ﻛﻨﻴﺪ و در ﮔﺮه ﻫﺎي آﺑﻲ ‪y‬ﻫﺎ را‪ .‬دﺳﺘﻮر درج ﻛﻪ ﺷﻤﺎ ﺑﺎﻳﺪ از ورودي ﺑﺨﻮاﻧﻴﺪ ﺑﻪ‬
‫ﺻﻮرت ‪ Insert x y‬ﺧﻮاﻫﺪ ﺑﻮد ﻛﻪ ‪ x‬و ‪ y‬ﻣﺨﺘﺼﺎت ﻧﻘﻄﻪ ﺑﺮاي درج در درﺧﺖ اﺳﺖ و ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻗﺒﻼً ﮔﻔﺘﻪ ﺷﺪ‬
‫ﺑﺎ دﻗﺖ دو رﻗﻢ اﻋﺸﺎر ﻫﺴﺘﻨﺪ‪ .‬اﻳﻦ دﺳﺘﻮر ﺧﺮوﺟﻲ اي ﻧﺪارد‪.‬‬
‫ﺟﺴﺘﺠﻮ‪ :‬ﺑﺮاي ﺟﺴﺘﺠﻮ ﻫﻢ ﻃﺒﻖ ﺗﻮﺿﻴﺤﻲ ﻛﻪ ﺑﺮاي درج ﮔﻔﺘﻪ ﺷﺪ ﺑﺎﻳﺪ ﺑﻪ ﮔﻮﻧﻪ اي ﺑﺎزﮔﺸﺘﻲ ﻋﻤﻞ ﻛﻨﻴﺪ ﻛﻪ در‬
‫ﻫﺮ ﻣﺮﺣﻠﻪ ﻛﻠﻴﺪ درﺳﺖ ﻣﻘﺎﻳﺴﻪ ﺷﻮد‪ .‬دﺳﺘﻮر ﺟﺴﺘﺠﻮ ﺑﻪ ﺻﻮرت ‪ Search x y‬اﺳﺖ و ﺷﻤﺎ ﺑﺎﻳﺪ در ﺻﻮرت ﭘﻴﺪا‬
‫ﺷﺪن ﻋﻨﺼﺮ‪ ،‬ﺣﺮف ‪ T‬و در ﻏﻴﺮاﻳﻨﺼﻮرت ﺣﺮف ‪ F‬را در ﺧﺮوﺟﻲ ﭼﺎپ ﻛﻨﻴﺪ‪.‬‬
‫‪ 1‬ﺑﺮاي آﺷﻨﺎﻳﻲ ﻛﺎﻣﻞ ﺗﺮ ﺑﺎ اﻳﻦ ﻧﻮع درﺧﺖ ﻫﺎ و اﻋﻤﺎل روي آن ﻫﺎ‪ ،‬اﺳﺘﻔﺎده از ﻣﻨﺎﺑﻊ اﻳﻨﺘﺮﻧﺘﻲ ﺑﻪ ﺧﺼﻮص وﻳﻜﻲ ﭘﺪﻳﺎ ﺑﻪ ﺷﺪت ﺗﻮﺻﻴﻪ ﻣﻴﺸﻮد‪.‬‬
‫ﺣﺬف‪ :‬ﺑﺮاي ﺣﺬف دﻗﻴﻘﺎً ﻣﺎﻧﻨﺪ د‪.‬د‪.‬ج ﻋﻤﻞ ﻛﻨﻴﺪ ﻓﻘﻂ ﺑﺮاي ﭘﻴﺪا ﻛﺮدن ﻋﻨﺼﺮ از ﺟﺴﺘﺠﻮي ﮔﻔﺘﻪ ﺷﺪه در ﺑﺎﻻ‬
‫اﺳﺘﻔﺎده ﻛﻨﻴﺪ‪ .‬ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ ﭘﻴﺪا ﻛﺮدن ﻋﻨﺼﺮ ﺑﻌﺪي و ﻗﺒﻠﻲ ﻳﻚ ﻋﻨﺼﺮ در ﭼﻨﻴﻦ درﺧﺘﻲ ﺑﺎﻳﺪ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﻣﺮﺣﻠﻪ‬
‫آن ﺻﻮرت ﮔﻴﺮد ﻳﻌﻨﻲ ﻋﻨﺼﺮ ﺑﻌﺪي ﻧﺴﺒﺖ ﺑﻪ ‪ x‬ﺑﺎﻳﺪ ﭘﻴﺪا ﺷﻮد ﻳﺎ ‪ .y‬ﻣﺜﻼً اﮔﺮ ﻗﺮار اﺳﺖ رﻳﺸﻪ ﺣﺬف ﺷﻮد ﺑﺎﻳﺪ ﻋﻨﺼﺮ‬
‫ﺑﻌﺪي ﻧﺴﺒﺖ ﺑﻪ ‪ x‬ﺟﺎﻳﮕﺰﻳﻦ آن ﺷﻮد‪ .‬دﺳﺘﻮر ﺣﺬف ﺑﻪ ﺻﻮرت ‪ Del x y‬اﺳﺖ و ﺧﺮوﺟﻲ اي ﻧﺪارد‪.‬‬
‫ﭼﺎپ ﻋﻨﺎﺻﺮ‪ :‬ﺑﺮاي ﭼﺎپ ﻋﻨﺎﺻﺮ ﻛﻪ ﺑﺎ دﺳﺘﻮر ‪ Print‬ﻣﺸﺨﺺ ﻣﻴﺸﻮد ﺑﺎﻳﺪ از ﭘﻤﺎﻳﺶ ﻣﻴﺎن ﺗﺮﺗﻴﺐ درﺧﺖ‬
‫اﺳﺘﻔﺎده ﻛﻨﻴﺪ و ﺗﻤﺎم ﻋﻨﺎﺻﺮ درﺧﺖ را در ﻳﻚ ﺳﻄﺮ ﺧﺮوﺟﻲ ﺑﻨﻮﻳﺴﻴﺪ‪ .‬ﺑﺎﻳﺪ ﻋﻨﺎﺻﺮ ﺑﺎ ﻛﺎﻣﺎ از ﻫﻢ ﺟﺪا ﺷﻮﻧﺪ و‬
‫ﻣﺨﺘﺼﺎت ﻫﺮ ﻋﻨﺼﺮ ﺑﺎ دو رﻗﻢ اﻋﺸﺎر و ﺑﻪ ﺻﻮرت ‪ x y‬ﻧﻮﺷﺘﻪ ﺷﺪه و ﺑﺎ ﻳﻚ ﻓﺎﺻﻠﻪ از ﻫﻢ ﺟﺪا ﺷﻮﻧﺪ‪ .‬ﻣﺜﻼً ﺑﻪ ﺻﻮرت‬
‫ﺧﻂ زﻳﺮ‪:‬‬
‫‪0.20 0.30,0.50 0.40,0.40 0.70,0.70 0.20‬‬
‫ﺟﺴﺘﺠﻮي ﺑﺎزه اي‪ :‬در اﻳﻦ ﻧﻮع ﺟﺴﺘﺠﻮ ﻳﻚ ﻣﺴﺘﻄﻴﻞ ﺑﻪ وﺳﻴﻠﻪ ﻣﺨﺘﺼﺎت ‪ 4‬رأس آن ﺑﻪ ﺷﻤﺎ داده ﻣﻴﺸﻮد و‬
‫ﺷﻤﺎ ﺑﺎﻳﺪ ﺗﻤﺎم ﻋﻨﺼﺮﻫﺎي درﺧﺖ را ﻛﻪ در آن ﻣﺴﺘﻄﻴﻞ ﻳﺎ روي آن ﻗﺮار ﻣﻴﮕﻴﺮﻧﺪ ﭘﻴﺪا ﻛﻨﻴﺪ‪ .‬ﺑﺮاي اﻳﻦ ﻛﺎر ﺑﺎﻳﺪ ﺑﻪ‬
‫ﺻﻮرت ﺑﺎزﮔﺸﺘﻲ درﺧﺖ را ﺑﻪ ﺳﻤﺖ ﺑﺮگ ﻫﺎ ﭘﻴﻤﺎﻳﺶ ﻛﻨﻴﺪ و در ﻫﺮ ﻣﺮﺣﻠﻪ ﻓﻘﻂ ﻣﺴﻴﺮي را اﻧﺘﺨﺎب ﻛﻨﻴﺪ ﻛﻪ‬
‫زﻳﺮدرﺧﺖ آن ﻣﻤﻜﻦ اﺳﺖ ﻧﻘﻄﻪ اي در ﺑﺎزه ﻣﻮرد ﻧﻈﺮ داﺷﺘﻪ ﺑﺎﺷﺪ‪ .‬ﺑﻨﺎﺑﺮاﻳﻦ از ﭘﻴﻤﺎﻳﺶ ﻛﻞ درﺧﺖ ﺧﻮدداري ﻛﻨﻴﺪ‬
‫و اﻟﮕﻮرﻳﺘﻢ را ﺑﺎ ﺑﻬﺘﺮﻳﻦ ﻣﺮﺗﺒﻪ اي ﻛﻪ ﻣﻴﺘﻮاﻧﻴﺪ ﺑﻨﻮﻳﺴﻴﺪ‪ .‬ﻗﺎﻟﺐ اﻳﻦ دﺳﺘﻮر ﭼﻨﻴﻦ اﺳﺖ‪Rect Search x1 y1 x2 :‬‬
‫‪ y2‬ﻛﻪ )‪ (x1,y1‬ﻣﺨﺘﺼﺎت ﻧﻘﻄﻪ ﺑﺎﻻﻳﻲ ﺳﻤﺖ ﭼﭗ ﻣﺴﺘﻄﻴﻞ و )‪ (x2,y2‬ﻣﺨﺘﺼﺎت ﻧﻘﻄﻪ ﭘﺎﻳﻴﻨﻲ ﺳﻤﺖ راﺳﺖ آن‬
‫اﺳﺖ‪ .‬ﺷﻤﺎ ﺑﺎﻳﺪ ﺗﻤﺎم ﻧﻘﺎط ﭘﻴﺪا ﺷﺪه را ﺑﻪ ﺗﺮﺗﻴﺐ ﺻﻌﻮدي ‪ x‬و ﺳﭙﺲ ﺻﻌﻮدي ‪ y‬در ﻳﻚ ﺧﻂ از ﺧﺮوﺟﻲ ﺑﻨﻮﻳﺴﻴﺪ‪.‬‬
‫ﻣﺎﻧﻨﺪ دﺳﺘﻮر ﭼﺎپ ﺑﺎﻳﺪ ﻧﻘﺎط ﺑﺎ ﻛﺎﻣﺎ از ﻫﻢ ﺟﺪا ﺷﻮﻧﺪ و ‪x‬و‪ y‬ﻧﻴﺰ ﺑﺎ ﻳﻚ ﻓﺎﺻﻠﻪ از ﻫﻢ ﺟﺪا ﺷﻮﻧﺪ‪.‬‬
‫ﻳﺎﻓﺘﻦ ﻧﺰدﻳﻚ ﺗﺮﻳﻦ ﻫﻤﺴﺎﻳﻪ ي ﻳﻚ ﻧﻘﻄﻪ‪ :‬اﻟﮕﻮرﻳﺘﻢ اﻳﻦ ﻋﻤﻞ ﺑﻪ ﻋﻬﺪه ﺷﻤﺎﺳﺖ‪ ،‬دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ ﻓﻘﻂ ﺑﻪ‬
‫زﻳﺮدرﺧﺖ ﻫﺎﻳﻲ ﺑﺮوﻳﺪ ﻛﻪ ﻧﻴﺎز اﺳﺖ و از ﭘﻴﻤﺎﻳﺶ ﻛﻞ درﺧﺖ ﺧﻮدداري ﻛﻨﻴﺪ‪ .‬دﺳﺘﻮر اﻳﻦ ﻋﻤﻠﻴﺎت ‪FindCN x y‬‬
‫اﺳﺖ و ﺷﻤﺎ ﺑﺎﻳﺪ ﻧﺰدﻳﻚ ﺗﺮﻳﻦ ﻧﻘﻄﻪ را در درﺧﺖ ﻧﺴﺒﺖ ﺑﻪ اﻳﻦ ﻧﻘﻄﻪ ﭘﻴﺪا ﻛﻨﻴﺪ و ﻣﺨﺘﺼﺎت آن را ﺑﻪ ﺻﻮرت ‪x y‬‬
‫در ﺧﺮوﺟﻲ ﺑﻨﻮﻳﺴﻴﺪ‪.‬‬
‫ورودي و ﺧﺮوﺟﻲ ﻧﻤﻮﻧﻪ‪:‬‬
‫ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻪ ﺷﺪ ﺷﻤﺎ ﺑﺎﻳﺪ دﺳﺘﻮرات را از ورودي اﺳﺘﺎﻧﺪارد ﺑﺨﻮاﻧﻴﺪ و ﻧﺘﺎﻳﺞ را در ﺧﺮوﺟﻲ اﺳﺘﺎﻧﺪارد ﺑﻨﻮﻳﺴﻴﺪ‪.‬‬
‫ﻋﺒﺎرت ‪ END‬ﺑﻪ ﺗﻨﻬﺎﻳﻲ در ﻳﻚ ﺧﻂ ﻧﺸﺎن دﻫﻨﺪه ﭘﺎﻳﺎن دﺳﺘﻮرات اﺳﺖ و ﭘﺲ از آن ﺑﺮﻧﺎﻣﻪ ﺑﺎﻳﺪ از اﺟﺮا ﺧﺎرج ﺷﻮد‪.‬‬
‫ﺧﺮوﺟﻲ‬
‫ورودي‬
‫‪Insert 0.70 0.20‬‬
‫‪Insert 0.50 0.40‬‬
‫‪Insert 0.90 0.60‬‬
‫‪0.50 0.40,0.70 0.20,0.90 0.60‬‬
‫‪T‬‬
‫‪Print‬‬
‫‪Search 0.90 0.60‬‬
‫‪Del 0.70 0.20‬‬
‫‪0.50 0.40‬‬
‫‪FindCN 0.50 0.50‬‬
‫‪END‬‬
‫ﺳﻮال دوم‪ :‬ﻧﻤﺎﻳﺶ درﺧﺘﻲ ‪ s-term‬ﻫﺎ‬
‫ﻳﻚ ‪ s-term‬ﺗﺮﻛﻴﺒﻲ از ﺣﺮف ‪ s‬و ﭘﺮاﻧﺘﺰ اﺳﺖ ﻛﻪ ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻌﺮﻳﻒ ﻣﻲﺷﻮد‪:‬‬
‫• ‪ s‬ﻳﻚ ‪ s-term‬اﺳﺖ‪.‬‬
‫• اﮔﺮ ‪M‬و‪ N‬دو ‪ s-term‬ﺑﺎﺷﻨﺪ‪ (MN) ،‬ﻫﻢ ﻳﻚ ‪ s-term‬اﺳﺖ‪.‬‬
‫ﻣﺜﺎل‪((((ss)(ss))s)(ss)) :‬‬
‫ﻳﻚ ‪ s-term‬را ﻣﻲﺗﻮان ﺑﻪ ﺻﻮرت ﻳﻚ درﺧﺖ دودوﻳﻲ ﻛﺎﻣﻞ ﻧﺸﺎن داد‪ .‬ﺑﺮاي ﻣﺜﺎل درﺧﺖ ﻣﺮﺑﻮط ﺑﻪ ﻋﺒﺎرت ﻓﻮق‬
‫ﺑﻪ ﺻﻮرت زﻳﺮ اﺳﺖ‪:‬‬
‫‪s‬‬
‫‪s‬‬
‫‪s‬‬
‫‪s‬‬
‫‪s‬‬
‫‪s‬‬
‫ﻫﺪف اﻳﻦ اﺳﺖ ﻛﻪ ﺑﺎ درﻳﺎﻓﺖ ﻳﻚ ‪ s-term‬درﺧﺖ آن ﺳﺎﺧﺘﻪ و ﭼﺎپ ﺷﻮد‪.‬‬
‫ﺑﺮاي ﭼﺎپ اﻳﻦ درﺧﺖ ﺑﻪ رﺋﻮس آن اﻋﺪادي ﺑﻪ ﺷﻴﻮهاي ﻛﻪ ﮔﻔﺘﻪ ﻣﻲﺷﻮد ﻧﺴﺒﺖ داده ﻣﻲﺷﻮد‪ ،‬و ﺳﭙﺲ ﺑﻪ ﺷﻴﻮه‬
‫ﻣﻴﺎن ﺗﺮﺗﻴﺐ)‪ (Preorder‬ﻧﻮﺷﺘﻪ ﻣﻲﺷﻮد‪.‬‬
‫ﺑﺮاي ﻧﺴﺒﺖ دادن اﻋﺪاد ﺑﻪ رﺋﻮس درﺧﺖ‪ ،‬ﺑﻪ رﻳﺸﻪ آن ﻋﺪد ‪ 1‬ﻧﺴﺒﺖ داده ﻣﻲﺷﻮد و ﺳﭙﺲ ﺑﻪ راس ﺳﻤﺖ ﭼﭗ ﻳﻚ‬
‫راس ﺑﺎ ﻋﺪد ‪ ،i‬ﻋﺪد ‪ 2*i‬و ﺑﻪ راس ﺳﻤﺖ راﺳﺖ آن ﻋﺪد ‪ 2*i+1‬ﻧﺴﺒﺖ داده ﻣﻲﺷﻮد‪.‬‬
‫‪s‬‬
‫ﺳﺎﺧﺘﺎر ورودي‪:‬‬
‫ﺧﻂ اول‪ s-term :‬ﺑﺎ ﺣﺪاﻛﺜﺮ ‪ 105‬ﺣﺮف ‪s‬‬
‫ورودي ﺑﺎﻳﺪ از ورودي اﺳﺘﺎﻧﺪارد ﺧﻮاﻧﺪه ﺷﻮد و ﺧﺮوﺟﻲ ﻧﻴﺰ در ﻛﻨﺴﻮل )ﺧﺮوﺟﻲ اﺳﺘﺎﻧﺪارد( ﻧﻮﺷﺘﻪ ﺷﻮد‪.‬‬
‫ﺳﺎﺧﺘﺎر ﺧﺮوﺟﻲ‪:‬‬
‫ﻓﺮض ﻛﻨﻴﺪ )‪ N=size(tree‬ﻛﻪ ‪ tree‬درﺧﺖ ﻣﺘﻨﺎﻇﺮ ‪ s-term‬اﺳﺖ‪.‬‬
‫ﺧﻂ اول ﺗﺎ ‪ N‬ام‪:‬‬
‫ﻧﻤﺎﻳﺶ ‪ preorder‬درﺧﺖ ﻣﺘﻨﺎﻇﺮ ﺑﺎ ‪ s-term‬ورودي ﺑﻪ وﺳﻴﻠﻪ اﻋﺪاد ﻧﺴﺒﺖ داده ﺷﺪه ﺑﻪ رﺋﻮس)در ﻫﺮ ﺧﻂ‬
‫ﻳﻚ ﻋﺪد(‬
‫ﻣﺤﺪودﻳﺖ زﻣﺎﻧﻲ‪:‬‬
‫‪ 2 :C++‬ﺛﺎﻧﻴﻪ و ‪ 5 :Java‬ﺛﺎﻧﻴﻪ‬
‫ﺧﺮوﺟﻲ ﻧﻤﻮﻧﻪ‬
‫ورودي ﻧﻤﻮﻧﻪ‬
‫‪1‬‬
‫‪2‬‬
‫‪4‬‬
‫‪5‬‬
‫‪3‬‬
‫)‪((ss)s‬‬
‫ﻧﻜﺎت ﻣﻬﻢ در اﻧﺠﺎم اﻳﻦ ﺗﻤﺮﻳﻦ‪:‬‬
‫اﮔﺮ ﭼﻪ اﺳﺘﻔﺎده از ﻣﻨﺎﺑﻊ اﻳﻨﺘﺮﻧﺘﻲ ﺑﺮاي ﻓﻬﻢ ﺑﻬﺘﺮ اﻳﻦ داده ﺳﺎﺧﺘﺎرﻫﺎ و اﻋﻤﺎل ﻣﺮﺑﻮط ﺑﻪ آن ﻫﺎ ﺗﻮﺻﻴﻪ ﻣﻴﺸﻮد وﻟﻲ‬
‫ﻫﺮﮔﻮﻧﻪ اﺳﺘﻔﺎده ﻣﺴﺘﻘﻴﻢ از ﻛﺪﻫﺎي ﻣﻮﺟﻮد در اﻳﻨﺘﺮﻧﺖ ﻳﺎ ﻛﺪ دوﺳﺘﺎﻧﺘﺎن ﺑﺎﻋﺚ از دﺳﺖ دادن ﻧﻤﺮه ﺗﻤﺮﻳﻦ و ﻧﻴﺰ‬
‫ﺟﺮﻳﻤﻪ ﻣﻴﺸﻮد‪.‬‬
‫در اﻧﺠﺎم اﻳﻦ ﺗﻤﺮﻳﻦ ﻣﺠﺎزﻳﺪ ﻛﻪ از ﻫﺮ ﻳﻚ از دو زﺑﺎن ‪ C++‬ﻳﺎ ﺟﺎوا اﺳﺘﻔﺎده ﻛﻨﻴﺪ اﻣﺎ ﻧﻤﻴﺘﻮاﻧﻴﺪ از ﻛﺘﺎﺑﺨﺎﻧﻪ ﻫﺎي‬
‫آﻣﺎده اﻳﻦ زﺑﺎن ﻫﺎ ﻣﺜﻞ ‪ Tree‬ﻳﺎ اﺳﺘﻚ اﺳﺘﻔﺎده ﻛﻨﻴﺪ‪ .‬اﺳﺘﻔﺎده از ‪Linked list‬ﻫﺎ ﻣﺠﺎز اﺳﺖ‪.‬‬
‫ﺗﻮﺻﻴﻪ ﻣﻴﺸﻮد اﻳﻦ ﺗﻤﺮﻳﻦ را ﺗﺎ ﺣﺪ ﺗﻮان ﺑﻪ ﺻﻮرت ﺷﻲء ﮔﺮا ﺑﻨﻮﻳﺴﻴﺪ ﺗﺎ ﺿﻤﻦ ﺻﺮﻓﻪ ﺟﻮﻳﻲ در ﻛﺪ‪ ،‬در ﻣﺮاﺣﻞ‬
‫ﺧﻄﺎﻳﺎﺑﻲ ﻣﺸﻜﻼت ﻛﻤﺘﺮي داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﺣﺘﻲ ﺷﺎﻳﺪ در ﺗﺤﻮﻳﻞ ﺣﻀﻮري ﻧﻤﺮه اﺿﺎﻓﻪ اي ﻧﻴﺰ ﺑﻪ آن ﺗﻌﻠﻖ ﺑﮕﻴﺮد‪.‬‬
‫ﻧﮕﺮان ورودي ﻫﺎي ﻧﺎﻣﻌﻘﻮل و اﺳﺘﺜﻨﺎﺋﺎت ﻧﺎدر ﻧﺒﺎﺷﻴﺪ‪ .‬اﮔﺮ ﺑﺮﻧﺎﻣﻪ ﺗﺎن ﻣﻨﻄﻘﺎً درﺳﺖ ﻧﻮﺷﺘﻪ ﺷﺪه ﺑﺎﺷﺪ اﻣﺘﻴﺎز ﻫﻤﻪ‬
‫ﺗﺴﺖ ﻫﺎ را ﺧﻮاﻫﺪ ﮔﺮﻓﺖ‪.‬‬
‫ﻓﺎﻳﻞ اﺻﻠﻲ ﻫﺮ ﺳﻮال ﺑﺎﻳﺪ ﺑﺎ ﻧﺎم ‪ Main.java‬ﻳﺎ ‪ Main.cpp‬و داﺧﻞ ﭘﻮﺷﻪ ﻣﺨﺼﻮص آن ﺳﻮال ﺑﺎﺷﺪ‪.‬‬
‫ﻣﻮﻓﻖ ﺑﺎﺷﻴﺪ‪.‬‬