แผนผังการค้นหาแบบไบนารีที่สมดุลเป็นสิ่งจำเป็นในการรับประกันการค้นหาO (บันทึก n) (หรือการดำเนินการที่คล้ายกัน) ในสภาพแวดล้อมแบบไดนามิกที่มีการแทรกและสุ่มคีย์จำนวนมากและ / หรือลบต้นไม้อาจทำให้รายการเชื่อมโยงแย่ลงซึ่งน่ากลัวสำหรับการค้นหา ดังนั้นจึงมีหลายชนิดของต้นไม้ไบนารีสมดุลตัวเองที่ต่อต้านผลกระทบนี้ (เช่นต้นไม้ AVLหรือต้นไม้ splay ) ต้นไม้เหล่านี้ขึ้นอยู่กับการหมุนแบบต่าง ๆที่ปรับสมดุลของต้นไม้
ผลัด
ในความท้าทายนี้เราจะดูเฉพาะการหมุนทางขวาเดียวการหมุน (การหมุนซ้ายจะสมมาตร) เช่นนี้:
5 3
/ \ / \
3 6 => 1 5
/ \ / \
1 4 4 6
หากมีใบใดใบ1
หนึ่ง4
หรือ6
มีต้นไม้ย่อยทางซ้ายหรือขวาการหมุนก็จะทำให้พวกมันอยู่ตรงนั้น หากนี่เป็นทรีย่อยของต้นไม้ที่มีขนาดใหญ่ขึ้นเราเพียงแค่ "ตัดมันออก" ที่โหนด5
และ "แนบใหม่" ต้นไม้ที่หมุน (ตอนนี้โหนด3
) ไปยังโหนดนั้น
ท้าทาย
ให้แผนภูมิการค้นหาแบบไบนารี่1และคีย์หมุนทรีบนโหนดนั้นตามที่อธิบายไว้ข้างต้น 5
ที่สำคัญที่ให้ไว้ในตัวอย่างข้างต้นจะเป็น
กฎและ I / O
- คุณสามารถใช้กุญแจประเภทใดก็ได้ตราบใดที่มี bijection ระหว่างปุ่มที่คุณเลือกและของกรณีทดสอบ
- คุณสามารถเลือกการแสดงใด ๆ สำหรับต้นไม้ไบนารีตราบเท่าที่ไม่มีความกำกวม (เช่น
[3,[]]
ไม่ชัดเจนเว้นแต่จะระบุไว้เป็นอย่างอื่น) และเป็นเรื่องปกติสำหรับภาษาที่คุณเลือก - เนื่องจากอินพุตจะเป็นแผนผังการค้นหาแบบไบนารีเสมอไม่มีคีย์ที่ซ้ำกัน
- คุณอาจคิดว่ากุญแจนั้นมีอยู่ในต้นไม้
- คุณอาจสมมติว่าโหนดที่มีรหัสมีลูกซ้าย
- คุณอาจไม่ถือว่าทรีย่อยถูกต้องภายใต้คีย์ที่ให้ไว้
- คุณอาจไม่คิดว่าต้นไม้ไม่สมดุลก่อนหมุน
- คุณอาจไม่คิดว่าต้นไม้มีความสมดุลหลังจากการหมุน
- คุณสามารถใช้วิธีI / O เริ่มต้น
- การส่งของคุณอาจเป็นฟังก์ชันที่ส่งคืนต้นไม้หรือโปรแกรมเต็มรูปแบบที่พิมพ์โซลูชัน
กรณีทดสอบ
ตัวอย่างเหล่านี้แสดงถึงต้นไม้ดังต่อไปนี้
- ถ้าเป็นใบไม้:
[]
- ถ้ามันเป็นต้นไม้ที่มีกุญแจ
x
และต้นไม้ทั้งสองใบเป็นใบไม้:[x]
- ถ้าเป็นต้นไม้ที่มีคีย์
x
และ subtreesleft
right
:[x,left,right]
ตัวอย่างแรกเป็นหนึ่งที่มีให้บริการในส่วนของการหมุน ถ้าด้วยเหตุผลบางอย่างที่คุณต้องการการแสดงภาพกราฟิกของพวกเขาที่นี่2คุณไป
5 [5,[3,[1],[4]],[6]] -> [3,[1],[5,[4],[6]]]
5 [5,[3,[1],[4]],[]] -> [3,[1],[5,[4],[]]]
5 [5,[3,[],[4]],[6]] -> [3,[],[5,[4],[6]]]
5 [5,[3,[1],[]],[]] -> [3,[1],[5]]
4 [8,[4,[2,[1],[3]],[6,[5],[7]]],[12,[10,[9],[11]],[14,[13],[15]]]] -> [8,[2,[1],[4,[3],[6,[5],[7]]]],[12,[10,[9],[11]],[14,[13],[15]]]]
8 [10,[8,[6,[4,[2,[],[3]],[5]],[7]],[9]],[11]] -> [10,[6,[4,[2,[],[3]],[5]],[8,[7],[9]]],[11]]
10 [10,[8,[6,[4,[2,[],[3]],[5]],[7]],[9]],[11]] -> [8,[6,[4,[2,[],[3]],[5]],[7]],[10,[9],[11]]]
9 [6,[3,[2],[5]],[9,[8],[12,[11],[15,[14],[]]]]] -> [6,[3,[2],[5]],[8,[],[9,[],[12,[11],[15,[14],[]]]]]]
7 [7,[5,[3,[1],[4]],[6]],[8]] -> [5,[3,[1],[4]],[7,[6],[8]]]
15 [17,[9,[5,[2,[0],[4]],[8]],[15,[13,[11,[10],[12]],[14]],[16]]],[40,[27,[21,[19,[18],[20]],[24,[22],[25]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]] -> [17,[9,[5,[2,[0],[4]],[8]],[13,[11,[10],[12]],[15,[14],[16]]]],[40,[27,[21,[19,[18],[20]],[24,[22],[25]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]]
21 [17,[9,[5,[2,[0],[4]],[8]],[15,[13,[11,[10],[12]],[14]],[16]]],[40,[27,[21,[19,[18],[20]],[24,[22],[25]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]] -> [17,[9,[5,[2,[0],[4]],[8]],[15,[13,[11,[10],[12]],[14]],[16]]],[40,[27,[19,[18],[21,[20],[24,[22],[25]]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]]
1: หมายความว่าสำหรับโหนดใด ๆ คีย์ทั้งหมดในทรีย่อยด้านซ้ายจะเล็กกว่าคีย์นั้นและคีย์ทั้งหมดในทรีย่อยด้านขวามีค่ามากกว่ามัน
2: เพื่อป้องกันไม่ให้ลิงค์เน่าฉันฝังมันเป็นความคิดเห็น
data B=B[B]Int
จะช่วยประหยัดไบต์ได้มากขึ้น