ในปัญหานี้ เราได้รับไบนารีทรีที่สมบูรณ์ งานของเราคือสร้างโปรแกรมเพื่อค้นหาผลรวมของโหนดภาพมิเรอร์ของต้นไม้ไบนารีที่สมบูรณ์ในลักษณะที่ไม่เป็นระเบียบ
ที่นี่ เราต้องหาเส้นทางที่ไม่เป็นระเบียบของต้นไม้ดวงอาทิตย์ด้านซ้าย จากนั้นสำหรับแต่ละโหนด เราจะเพิ่มภาพสะท้อนในกระจกด้วย ซึ่งหมายความว่า หากเราข้ามโหนดลีฟด้านซ้าย เราจะเพิ่มค่าของโหนดลีฟด้านขวาด้วย เนื่องจากเป็นโหนดภาพสะท้อน
คำจำกัดความที่สำคัญบางประการ
สร้างไบนารีทรีที่สมบูรณ์ เป็นไบนารีทรีที่ทุกระดับมีจำนวนโหนดสูงสุด ยกเว้นระดับสุดท้าย
การข้ามผ่านแบบไม่เรียงลำดับ เป็นเทคนิคการข้ามต้นไม้โดยไปที่ทรีย่อยทางซ้ายก่อน เยี่ยมชมรูท และเยี่ยมชมทรีย่อยทางขวา
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
ป้อนข้อมูล
ผลผลิต − 9 9 17 2
คำอธิบาย − การข้ามผ่านที่ไม่เป็นระเบียบของทรีย่อยด้านซ้ายคือ 5-7-8-1
การเพิ่มโหนดทั้งหมดจะเป็นการจำลองภาพ
5 + 4 = 9 7 + 2 = 9 8 + 9 = 17 1 + 1 = 2
เพื่อแก้ปัญหานี้ เราจะสำรวจต้นไม้ไบนารีโดยใช้การข้ามผ่านในลำดับ เราจะใช้สองโหนด โหนดหนึ่งเพื่อสำรวจทรีย่อยด้านซ้าย และอีกโหนดหนึ่งเพื่อไปที่มิเรอร์ของโหนด ตัวอย่างเช่น เรามีรูทโหนดสำหรับทรีย่อยทางซ้าย และสำหรับมัน เราจะมีมิเรอร์รูทที่จะข้ามผ่านอิมเมจมิเรอร์ของมัน
ตัวอย่าง
โปรแกรมเพื่อแสดงการทำงานของโซลูชัน
#include <iostream> using namespace std; typedef struct node { int data; struct node* left; struct node* right; node(int d){ data = d; left = NULL; right = NULL; } } Node; void printMirrorSum(Node* root, Node* rootMirror){ if (root->left == NULL && rootMirror->right == NULL) return; printMirrorSum(root->left, rootMirror->right); cout<<(root->left->data + rootMirror->right->data)<<endl; printMirrorSum(root->right, rootMirror->left); } int main(){ Node* root = new Node(1); root->left = new Node(7); root->right = new Node(2); root->left->left = new Node(5); root->left->right = new Node(8); root->right->left = new Node(9); root->right->right = new Node(4); cout<<"Sum of node and mirror image nodes are :\n"; printMirrorSum(root, root); if (root) cout<<(root->data + root->data); return 0; }
ผลลัพธ์
Sum of node and mirror image nodes are : 9 9 17 2