วิธีสร้างโครงสร้างข้อมูล Tree ใน C++ ด้วย Iterators
การเขียนโปรแกรมมักต้องการการใช้โครงสร้างข้อมูลเพื่อจัดการกับข้อมูลอย่างมีประสิทธิภาพ หนึ่งในโครงสร้างข้อมูลที่ใช้กันอย่างแพร่หลายคือ tree
คู่มือนี้จะสำรวจวิธีการสร้างโครงสร้างข้อมูล tree
ใน C++ โดยใช้ iterators แทนการใช้ pointers ซึ่งจะช่วยให้คุณมีวิธีที่แข็งแกร่งในการจัดการข้อมูลในลักษณะของลำดับชั้น
การทำความเข้าใจกับปัญหา
คุณอาจจะสงสัยว่า ฉันจะสามารถทำการพัฒนาโครงสร้างต้นไม้ใน C++ ที่ใช้ iterators สำหรับการนำทางได้อย่างไร? วิธีการนี้สามารถทำให้การเดินทางและการจัดการกับโหนดในต้นไม้เป็นเรื่องง่ายขึ้นโดยไม่จำเป็นต้องจัดการ pointer อย่างชัดเจน ซึ่งอาจมีแนวโน้มที่จะเกิดข้อผิดพลาดและมีความซับซ้อน
การหาการใช้งาน tree
ที่มีอยู่ใน C++ Standard Library (STL) อาจเป็นเรื่องท้าทายโชคดีที่มีทางเลือกเช่น tree.hh
ที่ตอบสนองความต้องการนี้
การสำรวจการใช้งานต้นไม้แบบง่าย
การใช้ tree.hh
ซึ่งเป็นไฟล์หัวเฉพาะที่ให้การใช้งานต้นไม้เป็นวิธีที่แนะนำ ด้านล่างนี้เป็นการแตกออกของวิธีการสร้างและจัดการต้นไม้โดยใช้ไลบรารีนี้
โครงสร้างพื้นฐาน
นี่คือตัวอย่างโค้ดที่แสดงให้เห็นถึงการสร้างต้นไม้:
#include <iostream>
#include "tree.hh"
using namespace std;
int main() {
tree<int> myTree;
tree<int>::iterator i = myTree.root();
*i = 42; // กำหนดค่าให้กับราก (root)
// เพิ่มลูกให้กับราก
tree<int>::iterator j = i.add_child();
*j = 777; // กำหนดค่าให้กับลูก
j = j.parent(); // กลับไปที่ parent
// เปรียบเทียบ iterators
if (i == myTree.root() && i == j)
cout << "i และ j ชี้ไปที่รากเหมือนกัน\n";
return 0;
}
การอธิบายโค้ด
-
Header และ Namespace: การใช้คำสั่ง
#include
นำเข้าไลบรารีต้นไม้ ในขณะที่using namespace std;
ช่วยให้เราใช้ส่วนประกอบของไลบรารีมาตรฐานได้สะดวกขึ้น -
การสร้างต้นไม้: ตัวอย่างต้นไม้
myTree
ถูกสร้างขึ้นด้วยประเภทint
-
การเพิ่มโหนด: โหนดสามารถเพิ่มได้อย่างมีประสิทธิภาพด้วย
add_child()
และค่าต่างๆ สามารถกำหนดได้โดยตรงโดยใช้ตัวดำเนินการ dereference -
การนำทางในต้นไม้: คุณสามารถนำทางไปยังโหนด parent ได้อย่างง่ายดายโดยใช้
parent()
คุณสมบัติเพิ่มเติมจาก tree.hh
ไลบรารี tree.hh
ให้ฟังก์ชันเพิ่มเติมสำหรับการจัดการต้นไม้ เช่น:
-
Iterators: ที่ช่วยให้สามารถเดินทางผ่านองค์ประกอบของต้นไม้ (เช่น พี่น้อง)
-
Sibling Iterators: สำหรับเข้าถึงและจัดการกับโหนดพี่น้องได้ง่าย
ตัวอย่างการใช้งานขั้นสูง
นี่คือวิธีที่คุณสามารถใช้ tree.hh
ได้อย่างกว้างขวางมากขึ้น:
int main(int argc, char **argv) {
tree<string> tr;
tree<string>::iterator top = tr.begin();
// สร้างต้นไม้
tree<string>::iterator one = tr.insert(top, "one");
tree<string>::iterator two = tr.append_child(one, "two");
tr.append_child(two, "apple");
// เพิ่มลูกมากขึ้น
tr.append_child(two, "banana");
tr.append_child(one, "three");
// ค้นหาโหนด
auto loc = find(tr.begin(), tr.end(), "two");
if(loc != tr.end()) {
tree<string>::sibling_iterator sib = tr.begin(loc);
while(sib != tr.end(loc)) {
cout << (*sib) << endl;
++sib;
}
}
}
สิ่งที่คุณสามารถทำได้
-
การแทรกและเพิ่มลูกได้ง่าย: วิธี
insert
และappend_child
ช่วยจัดการโครงสร้างต้นไม้โดยไม่ต้องมีความรู้ลึกเกี่ยวกับการจัดการ pointer -
ฟังก์ชันการค้นหา: ใช้ STL algorithms เพื่อค้นหาโหนดภายในต้นไม้ได้อย่างมีประสิทธิภาพ
ตัวเลือกทางเลือก
หากคุณกำลังมองหาโครงสร้างเชื่อมโยงที่มีประโยชน์คล้ายกับต้นไม้ให้พิจารณาการใช้ map
:
- การรับประกันประสิทธิภาพ: Maps ให้การค้นหา, การแทรก และการลบในแบบลอการิธึม ทำให้มีประสิทธิภาพสำหรับกรณีการใช้งานหลาย ๆ อย่าง
- การจัดการอัตโนมัติ: Maps จัดการโครงสร้างของตนเองภายใน ซึ่งช่วยลดความซับซ้อนสำหรับนักพัฒนา
สรุป
การสร้างโครงสร้างข้อมูล tree
ใน C++ โดยใช้ iterators สามารถทำให้การเขียนโปรแกรมที่เกี่ยวข้องกับการจัดการข้อมูลในลักษณะของลำดับชั้นเป็นเรื่องง่ายขึ้น ไลบรารี tree.hh
เป็นทางเลือกที่แข็งแกร่งที่ควรสำรวจสำหรับผู้ที่ต้องการหลีกเลี่ยงความซับซ้อนของ pointers โปรดจำไว้ว่าการใช้ maps
ก็สามารถให้ฟังก์ชันการทำงานที่คล้ายเมื่อมีความเหมาะสม
ด้วยคู่มือนี้ คุณควรมีพื้นฐานที่แข็งแกร่งในการเริ่มต้นการสร้างและจัดการต้นไม้ในแอปพลิเคชัน C++ ของคุณ