พิจารณาโหนดที่ผ่านระหว่างเส้นความชัน -1 การข้ามเส้นทแยงมุมของไบนารีทรีจะเป็นการสำรวจและพิมพ์โหนดทั้งหมดที่มีอยู่ระหว่างบรรทัดเหล่านี้
ให้เรากำหนดโครงสร้างที่จะเป็นตัวแทนของโหนดต้นไม้ที่มีข้อมูลและโหนดลูกของโหนดซ้ายและขวา หากนี่เป็นโหนดแรกที่สร้างขึ้น แสดงว่าเป็นโหนดรูท มิฉะนั้นจะเป็นโหนดย่อย
struct Node { int data; struct Node *leftChild, *rightChild; };
ต่อไป เราสร้างฟังก์ชัน createNode(int data) ที่ใช้ค่า int และกำหนดให้กับสมาชิกข้อมูลของโหนด ฟังก์ชันจะส่งกลับตัวชี้ไปยังโหนดโครงสร้างที่สร้างขึ้น นอกจากนี้ ลูกซ้ายและขวาของโหนดที่สร้างขึ้นใหม่จะถูกตั้งค่าเป็นโมฆะ
struct Node* newNode(int data){ struct Node* node = new Node(); node->data = data; node->leftChild = node->rightChild = NULL; return node; }
ฟังก์ชัน traverseDiagonal(Node* root, int depth, map
void traverseDiagonal(Node* root, int depth, map<int, vector<int>> &m){ if(root){ m[depth].push_back(root->data);
จากนั้นเราทำการเคลื่อนที่แบบวนซ้ำแบบวนซ้ำของต้นไม้เพื่อติดตามระยะทางในแนวทแยงและเพิ่ม 1 ให้กับความลึกทุกครั้งที่เราสำรวจลูกด้านซ้ายของต้นไม้ เราไม่ได้เพิ่มความลึกเมื่อเราสำรวจลูกที่ถูกต้องของต้นไม้
traverseDiagonal(root->leftChild, depth+1, myMap); traverseDiagonal(root->rightChild, depth, myMap);
ต่อไป ในฟังก์ชันหลักของเรา เราสร้างแผนผังโดยใช้ฟังก์ชัน createNode(data)
Node *root = createNode(10); root->leftChild = createNode(5); root->rightChild = createNode(15); root->leftChild->leftChild = createNode(4); root->leftChild->rightChild = createNode(6); root->rightChild->rightChild = createNode(17); root->rightChild->rightChild->leftChild = createNode(16);
จากนั้นเราประกาศแผนที่ myMap ที่มี int เป็นคีย์และเวกเตอร์ของ int เป็นค่า แผนที่นี้จะถูกส่งต่อไปยัง traverseDiagonal พร้อมกับโหนดรากและความลึกปัจจุบัน
map<int, vector<int>> myMap; traverseDiagonal(root, 0, myMap);
หลังจากที่แผนที่ myMap เต็มไปด้วยค่า เราจะวนซ้ำโดยใช้ช่วงที่อิงจากการวนซ้ำและพิมพ์ค่าในแนวทแยงเหล่านั้น
for(auto k: myMap){ for(auto Nodes: k.second) cout<<Nodes<<" "; cout<<endl; }
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อค้นหาการข้ามผ่านแนวทแยงของไบนารีทรี
#include <iostream> #include <map> #include <vector> using namespace std; struct Node{ int data; Node *leftChild, *rightChild; }; Node* createNode(int data){ Node* node = new Node(); node->data = data; node->leftChild = node->rightChild = NULL; return node; } void traverseDiagonal(Node* root, int depth, map<int, vector<int>> &myMap){ if(root){ m[depth].push_back(root->data); traverseDiagonal(root->leftChild, depth+1, myMap); traverseDiagonal(root->rightChild, depth, myMap); } } int main(){ Node *root = createNode(10); root->leftChild = createNode(5); root->rightChild = createNode(15); root->leftChild->leftChild = createNode(4); root->leftChild->rightChild = createNode(6); root->rightChild->rightChild = createNode(17); root->rightChild->rightChild->leftChild = createNode(16); map<int, vector<int>> myMap; traverseDiagonal(root, 0, myMap); for(auto k: myMap){ for(auto Nodes: k.second) cout<<Nodes<<" "; cout<<endl; } }
ผลลัพธ์
รหัสข้างต้นจะสร้างผลลัพธ์ต่อไปนี้ -
10 15 17 5 6 16 4