Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

รวมเส้นทางสูงสุดในทรีไบนารีใน C++


ในปัญหานี้ เราได้รับไบนารีทรีโดยแต่ละโหนดมีค่า งานของเราคือสร้างโปรแกรมเพื่อค้นหาผลรวมเส้นทางสูงสุดระหว่างสองใบของไบนารีทรี

ที่นี่ เราต้องหาเส้นทางจากโหนดปลายหนึ่งไปยังโหนดปลายสุดอื่นที่จะให้ผลรวมของค่าสูงสุด เส้นทางผลรวมสูงสุดนี้สามารถ/ไม่สามารถรวมโหนดรูทได้

ต้นไม้ไบนารี เป็นโครงสร้างข้อมูลแบบต้นไม้ซึ่งแต่ละโหนดสามารถมีโหนดย่อยได้สูงสุดสองโหนด สิ่งเหล่านี้เรียกว่าลูกซ้ายและขวา

ตัวอย่าง

รวมเส้นทางสูงสุดในทรีไบนารีใน C++

มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน −

ป้อนข้อมูล − //ไบนารีทรี…

ผลผลิต − 24

คำอธิบาย − เส้นทางจากโหนดปลายเท้า − 2 ถึง 9 จะให้ผลรวมสูงสุดคือ (2 + 5 + 6 -2 + 4 + 9 ) =24

เพื่อแก้ปัญหานี้ เราจะทำการข้ามต้นไม้และเก็บผลรวมสูงสุดสำหรับทรีย่อยย่อยด้านซ้าย/ขวาสำหรับโหนดปัจจุบัน นอกจากนี้ เราจะพบเส้นทางสูงสุดระหว่างโหนดปลายทั้งสองจนถึงตอนนี้

สำหรับทุกๆ โหนด เราจะค้นหาเส้นทาง leaf to leaf สูงสุดที่เป็นไปได้สำหรับแผนผังย่อย จากนั้นเปรียบเทียบกับเส้นทางสูงสุดโดยรวมและเก็บค่าสูงสุดของทั้งสองค่าไว้ในค่าผลรวมของเส้นทางสูงสุดทั่วโลก

ลองดูวิธีแก้ปัญหานี้จากตัวอย่างของเราเพื่อทำความเข้าใจวิธีแก้ปัญหาให้ดีขึ้น -

ผลรวมสูงสุดทั่วโลก =6 (สำหรับเส้นทาง 2→5→-1)

ตอนนี้เราจะตรวจสอบเพื่อรับ 6 เป็นโหนดรูท

รวมเส้นทางสูงสุดในทรีไบนารีใน C++

ในทรีย่อยด้านซ้าย −

ผลรวมของเส้นทางจนถึงโหนดปลายสุดคือ 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