พิจารณาโหนดที่ผ่านระหว่างเส้นความชัน -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