ฉันคิดว่าคุณมีการสร้างหน้าของคุณคว่ำ เมื่อโหนดแยกมันไม่ได้สร้างโหนดเพิ่มเติมลงลำดับชั้น (โหนดลูกชายในศัพท์ของคุณ) แทนที่จะสร้างขึ้นไปทางราก อย่างที่หนังสือบอก
โปรดทราบว่าการเจริญเติบโตอยู่ที่ด้านบนของต้นไม้และนี่คือลักษณะที่แท้จริงของต้นไม้ B – tree เพื่อให้แน่ใจว่าคุณสมบัติที่สำคัญที่จะมีใบทั้งหมดอยู่ในระดับเดียวกันเสมอและแต่ละโหนดแตกต่างจากรากอย่างน้อย เต็ม 50%
(ความสำคัญของฉัน)
จาก ebook ที่เชื่อมโยง:
คำจำกัดความ 5.1 AB – tree of order m (m ≥ 3) ... แต่ละโหนดมีได้มากที่สุด m - 1 คีย์
การออกกำลังกายสำหรับ m = 3 ดังนั้นมากที่สุด 2 คีย์ต่อโหนด
ปุ่มสองปุ่มแรกนั้นง่าย - พวกเขาเข้าไปในหน้าแรก:
A:[1,2]
ฉันจะใช้ศิลปะ ASCII ฉันจะติดป้ายกำกับแต่ละหน้าตามลำดับที่สร้างขึ้นและแสดงปุ่ม / ตัวชี้ภายในหน้า ดังนั้นหน้า P มีค่าคีย์ K1 และ K2 P:[k1,k2]
จะ
ตอนนี้คีย์ 3 เข้ามา ตามส่วน 5.2.1 ... การแทรกงานแรกคือการค้นหา สิ่งนี้เป็นตัวกำหนดว่ากุญแจ 3 ควรอยู่ในหน้า A - หน้าเดียวที่เรามี เพิ่มเติม "ถ้า [โหนดนั้น] เต็มมันจะถูกแยกออกเป็นสองโหนด" หน้าเต็มดังนั้นจึงต้องแยก ตอนนี้เรามี
A:[1,2] B:[3, ]
แต่นี่ไม่ใช่ต้นไม้! ตามที่หนังสือบอกไว้:
ตัวชี้ไปยัง [โหนดใหม่], .. จะถูกแทรกลงในโหนดพ่อ .. ของ [โหนดปัจจุบัน] โดยการดำเนินการแทรกซ้ำในโหนดนี้ [เช่นโหนดพ่อ] กระบวนการแยกและย้ายขั้นตอนนี้อาจดำเนินต่อไปหากจำเป็นถึงรูทและหากต้องแยกจะมีการสร้างรูทโหนดใหม่ ..
(ความสำคัญของฉันที่จะแสดงการประมวลผลขึ้นต้นไม้ไปทางรากไม่ลงไปที่ใบ)
ดังนั้นเราจะต้องใส่ตัวชี้ไปยังหน้าใหม่ (B) ในบิดาของหน้าปัจจุบัน (A) จะต้องมีโหนดรูทใหม่:
C:[2,3]
/ \
A:[1,2] B:[3, ]
ฉันมีพอยน์เตอร์ในหน้าเว็บที่ไม่ใช่ใบไม้ซึ่งชี้ไปที่ค่าสูงสุดในโหนดลูก (ลูกชาย) ข้อความที่เชื่อมโยงของคุณอาจทำสิ่งนี้แตกต่างกัน แต่ผลลัพธ์จะเท่ากัน
ค่าคีย์ 4 มาถึง; ทำตามอัลกอริทึมที่เราค้นหาเพื่อค้นหาหน้าที่ควรจะอยู่ ควรเป็นหน้า B มีที่ว่างสำหรับมันเราจึงอัปเดตหน้านั้นและตัวชี้ในหน้า C:
C:[2,4]
/ \
A:[1,2] B:[3,4]
ต่อไปเราจะใส่รหัส 5 ควรไปที่หน้า B แต่เต็มแล้ว ดังนั้นมันจึงแยก
C:[2,4]
/ \
A:[1,2] B:[3,4] D:[5, ]
เราต้องอัปเดตโหนดพ่อ มันก็เต็มเช่นกันดังนั้นจึงแยก:
C:[2,4] E:[5, ]
/ \ \
A:[1,2] B:[3,4] D:[5, ]
การแยกจะแพร่กระจายและโหนดรูทรูปแบบใหม่:
F:[4,5]
/ \
C:[2,4] E:[5, ]
/ \ \
A:[1,2] B:[3,4] D:[5, ]
ต้นไม้จะรักษาระดับความลึกที่เหมือนกันในทุกสาขา สิ่งนี้สำคัญสำหรับประสิทธิภาพที่คาดการณ์ได้ (บางคนบอกว่า B ใน B-Tree ย่อมาจาก "balance" ด้วยเหตุผลอย่างนี้)
สำหรับส่วนที่สอง - "เป็นไปได้หรือไม่ที่จะป้อนระเบียนด้วยปุ่มต่างๆเพื่อให้มีต้นไม้ที่มีความสูงน้อยกว่า" ด้วย 5 คีย์และสองปุ่มต่อโหนดเราต้องการโหนดใบไม้อย่างน้อย 3 โหนดเพื่อเก็บค่าทั้งหมดและความสูง 3 เพื่อสร้างต้นไม้ ดังนั้นการจัดเรียงของฉันจึงเหมาะสมที่สุดสำหรับข้อมูลลำดับและอัลกอริธึมที่กำหนด
หนังสือเล่มนี้ใช้การจัดเรียงตัวชี้ที่แตกต่างกันอย่างมากกับสิ่งที่ฉันใช้และการจัดเรียงหน้าแยกที่แตกต่างกัน สิ่งนี้จะมีความสำคัญนำไปสู่หน้าเต็มส่วน มีส่วนในหน้า 42 ที่เรียกว่า "การโหลดข้อมูล" ที่แสดงว่าหน้าเต็มรูปแบบสามารถทำได้โดยการโหลดออกจากลำดับที่สำคัญรองรับลางสังหรณ์ของฉัน อย่างไรก็ตามฉันหวังว่าฉันจะให้พอยน์เตอร์เพียงพอแก่คุณและคุณจะสามารถใช้โครงสร้างตัวชี้ของหนังสือเพื่อทำงานนั้นด้วยตัวคุณเอง
ฉันเจอการจำลองแบบโต้ตอบนี้ของวิธีการที่ต้นไม้ B เติบโตขึ้น