ในปัญหานี้ เราได้รับไบนารีทรีโดยแต่ละโหนดมีค่า งานของเราคือสร้างโปรแกรมเพื่อค้นหาผลรวมเส้นทางสูงสุดระหว่างสองใบของไบนารีทรี
ที่นี่ เราต้องหาเส้นทางจากโหนดปลายหนึ่งไปยังโหนดปลายสุดอื่นที่จะให้ผลรวมของค่าสูงสุด เส้นทางผลรวมสูงสุดนี้สามารถ/ไม่สามารถรวมโหนดรูทได้
ต้นไม้ไบนารี เป็นโครงสร้างข้อมูลแบบต้นไม้ซึ่งแต่ละโหนดสามารถมีโหนดย่อยได้สูงสุดสองโหนด สิ่งเหล่านี้เรียกว่าลูกซ้ายและขวา
ตัวอย่าง −
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน −
ป้อนข้อมูล − //ไบนารีทรี…
ผลผลิต − 24
คำอธิบาย − เส้นทางจากโหนดปลายเท้า − 2 ถึง 9 จะให้ผลรวมสูงสุดคือ (2 + 5 + 6 -2 + 4 + 9 ) =24
เพื่อแก้ปัญหานี้ เราจะทำการข้ามต้นไม้และเก็บผลรวมสูงสุดสำหรับทรีย่อยย่อยด้านซ้าย/ขวาสำหรับโหนดปัจจุบัน นอกจากนี้ เราจะพบเส้นทางสูงสุดระหว่างโหนดปลายทั้งสองจนถึงตอนนี้
สำหรับทุกๆ โหนด เราจะค้นหาเส้นทาง leaf to leaf สูงสุดที่เป็นไปได้สำหรับแผนผังย่อย จากนั้นเปรียบเทียบกับเส้นทางสูงสุดโดยรวมและเก็บค่าสูงสุดของทั้งสองค่าไว้ในค่าผลรวมของเส้นทางสูงสุดทั่วโลก
ลองดูวิธีแก้ปัญหานี้จากตัวอย่างของเราเพื่อทำความเข้าใจวิธีแก้ปัญหาให้ดีขึ้น -
ผลรวมสูงสุดทั่วโลก =6 (สำหรับเส้นทาง 2→5→-1)
ตอนนี้เราจะตรวจสอบเพื่อรับ 6 เป็นโหนดรูท
ในทรีย่อยด้านซ้าย −
ผลรวมของเส้นทางจนถึงโหนดปลายสุดคือ 7 และ 4
สูงสุดคือ 7 (สำหรับเส้นทาง 5→2)
ในทรีย่อยด้านขวา −
ผลรวมของเส้นทางจนถึงโหนดปลายสุดคือ 5 สำหรับเส้นทาง (1rarr;-3rarr;7) ซึ่งเป็นวิธีหนึ่งที่เป็นไปได้
ไม่ ผลรวมของเส้นทางระหว่างโหนดปลายสุดคือ −
ผลรวมสูงสุดของ leaf to root(6) ในทรีย่อยด้านซ้าย + root + ผลรวมสูงสุดของ leaf to root(6) ในทรีย่อยด้านขวา =7 + 6 + 5 =18.
เปรียบเทียบกับผลรวมเส้นทางสูงสุดทั่วโลก (6), ผลรวมเส้นทางสูงสุดทั่วโลกใหม่ =18
ตัวอย่าง
โปรแกรมค้นหาผลรวมเส้นทางสูงสุดระหว่างโหนดปลายทั้งสอง -
#include <bits/stdc++.h> using namespace std; struct Node{ int data; struct Node* left, *right; }; struct Node* insertNode(int data){ struct Node* node = new(struct Node); node->data = data; node->left = node->right = NULL; return (node); } int max(int a, int b) { return (a >= b)? a: b; } int maxPathSumLeaf(struct Node *root, int &maxSum){ if (root==NULL) return 0; if (!root->left && !root->right) return root->data; int leftSubTree = maxPathSumLeaf(root->left, maxSum); int rightSubTree = maxPathSumLeaf(root->right, maxSum); if (root->left && root->right){ maxSum = max(maxSum, leftSubTree + rightSubTree + root->data); return max(leftSubTree, rightSubTree) + root->data; } return (!root->left)? rightSubTree + root->data: leftSubTree + root->data; } int main(){ struct Node *root = insertNode(-2); root->left = insertNode(6); root->right = insertNode(4); root->left->left = insertNode(5); root->left->right = insertNode(1); root->left->left->left = insertNode(2); root->left->left->right = insertNode(-1); root->left->right->left = insertNode(-3); root->left->right->left->left = insertNode(7); root->right->left = insertNode(9); root->right->right = insertNode(3); int maxSum = INT_MIN; maxPathSumLeaf(root, maxSum); cout<<"Max pathSum of between two leaf nodes for the given binary tree is "<<maxSum; return 0; }
ผลลัพธ์
Max pathSum of between two leaf nodes for the given binary tree is 24