พิจารณาโหนดที่ผ่านระหว่างเส้นความชัน -1 ผลรวมในแนวทแยงของไบนารีทรีจะคำนวณโดยผลรวมของข้อมูลโหนดทั้งหมดที่มีอยู่ระหว่างบรรทัดอ้างอิงเหล่านี้
ให้เรากำหนดโครงสร้างที่จะเป็นตัวแทนของโหนดต้นไม้ที่มีข้อมูลและโหนดลูกของโหนดซ้ายและขวา หากนี่เป็นโหนดแรกที่สร้างขึ้น แสดงว่าเป็นโหนดรูท มิฉะนั้นจะเป็นโหนดย่อย
struct Node { int data; struct Node *leftChild, *rightChild; };
ต่อไป เราสร้างฟังก์ชัน createNode(int data) ที่ใช้ค่า int และกำหนดให้กับสมาชิกข้อมูลของโหนดหลังจากสร้างโหนดใหม่ ฟังก์ชันจะส่งกลับตัวชี้ไปยังโหนดที่สร้างขึ้น
Node * createNode(int data){ Node * node = new Node; node->data = data; return node; }
ถัดไป diagonal_sum(โหนด *root, int depth, map
void diagonal_sum(Node *root, int depth, map<int, int> &diagonalSum){ if(root){ diagonalSum[depth]+=root->data; diagonal_sum(root->leftChild, depth+1, diagonalSum); diagonal_sum(root->rightChild, depth, diagonalSum); } }
ภายในฟังก์ชันหลักของเรา เราสร้างแผนผังโดยใช้เมธอด createNode(data) และสร้างแผนที่ SumMap ด้วย โหนดรูท ความลึกปัจจุบันซึ่งเท่ากับ 1 และ sumMap จะถูกส่งไปยัง diagonal_sum โดยที่ sumMap เต็มไปด้วยคู่คีย์-ค่า ต่อไป เราสร้าง iterator เพื่อวนซ้ำบนแผนที่ sumMap
int main(){ Node *root = createNode(1); root->rightChild = createNode(3); root->rightChild->leftChild = createNode(4); root->rightChild->leftChild->leftChild = createNode(12); root->rightChild->leftChild->rightChild = createNode(7); root->leftChild = createNode(2); root->leftChild->leftChild = createNode(9); root->leftChild->rightChild = createNode(6); root->leftChild->leftChild->rightChild = createNode(10); root->leftChild->rightChild->leftChild = createNode(11); root->rightChild->rightChild = createNode(5); map<int,int> sumMap; diagonal_sum(root, 1, sumMap); map<int,int>::iterator it;
สุดท้ายเราวนซ้ำบน SumMap โดยใช้ตัววนซ้ำภายใน for ของเราและพิมพ์ผลรวมในแนวทแยง
for(it=sumMap.begin(); it!=sumMap.end();++it){ int value = it->second; cout<<value<<"\t"; }
ตัวอย่าง
ให้เรามาดูการใช้งานต่อไปนี้เพื่อค้นหาผลรวมแนวทแยงของไบนารีทรี
#include<iostream> #include<map> using namespace std; struct Node{ int data; struct Node* leftChild, *rightChild; }; Node * createNode(int data){ Node * node = new Node; node->data = data; return node; } void diagonal_sum(Node *root, int depth, map<int, int> &diagonalSum){ if(root){ diagonalSum[depth]+=root->data; diagonal_sum(root->leftChild, depth+1, diagonalSum); diagonal_sum(root->rightChild, depth, diagonalSum); } } int main(){ Node *root = createNode(1); root->rightChild = createNode(3); root->rightChild->leftChild = createNode(4); root->rightChild->leftChild->leftChild = createNode(12); root->rightChild->leftChild->rightChild = createNode(7); root->leftChild = createNode(2); root->leftChild->leftChild = createNode(9); root->leftChild->rightChild = createNode(6); root->leftChild->leftChild->rightChild = createNode(10); root->leftChild->rightChild->leftChild = createNode(11); root->rightChild->rightChild = createNode(5); map<int,int> sumMap; diagonal_sum(root, 1, sumMap); map<int,int>::iterator it; for(it=sumMap.begin(); it!=sumMap.end();++it){ int value = it->second; cout<<value<<"\t"; } return 0; }
ผลลัพธ์
รหัสข้างต้นจะสร้างผลลัพธ์ต่อไปนี้ -
91942