สมมติว่าเรามีต้นไม้ไบนารี เราต้องคำนวณความยาวของเส้นทางที่ยาวที่สุดซึ่งประกอบด้วยโหนดที่มีค่าต่อเนื่องกันตามลำดับที่เพิ่มขึ้น ทุกโหนดจะถือว่าเป็นเส้นทางที่มีความยาว 1
ดังนั้นหากอินพุตเป็นแบบ
จากนั้นเอาต์พุตจะเป็น 3 เนื่องจาก (11, 12, 13) เป็นเส้นทางต่อเนื่องสูงสุด
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดฟังก์ชัน Solve() ซึ่งจะทำการ root, prev_data, prev_length
- ถ้าไม่ใช่รูทก็ไม่ใช่ศูนย์ ดังนั้น −
- ส่งคืนprev_length
- cur_data :=val ของรูท
- ถ้า cur_data เหมือนกับ prev_data + 1 แล้ว −
- คืนค่าสูงสุดของการแก้ปัญหา (ด้านซ้ายของ root, cur_data, prev_length+1) และแก้ปัญหา (ด้านขวาของ root, cur_data, prev_length+1)
- newPathLen :=สูงสุดของการแก้ปัญหา (ด้านซ้ายของ root, cur_data, 1) และการแก้ปัญหา (ด้านขวาของ root, cur_data, 1)
- คืนค่าสูงสุดของ prev_length และ newPathLen
- จากวิธีหลัก ให้ทำดังนี้ -
- ถ้ารูทเหมือนกับ NULL แล้ว −
- คืน 0
- ส่งคืนการแก้(root, val ของ root-1, 0)
ตัวอย่าง (C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; class TreeNode { public: int val; TreeNode *left, *right; TreeNode(int data) { val = data; left = NULL; right = NULL; } }; int solve(TreeNode *root, int prev_data, int prev_length){ if (!root) return prev_length; int cur_data = root->val; if (cur_data == prev_data+1){ return max(solve(root->left, cur_data, prev_length+1), solve(root->right, cur_data, prev_length+1)); } int newPathLen = max(solve(root->left, cur_data, 1), solve(root->right, cur_data, 1)); return max(prev_length, newPathLen); } int maxLen(TreeNode *root){ if (root == NULL) return 0; return solve(root, root->val-1, 0); } int main(){ TreeNode *root = new TreeNode(10); root->left = new TreeNode(11); root->right = new TreeNode(9); root->left->left = new TreeNode(13); root->left->right = new TreeNode(12); root->right->left = new TreeNode(13); root->right->right = new TreeNode(8); cout << maxLen(root); return 0; }
อินพุต
TreeNode *root = new TreeNode(10); root->left = new TreeNode(11); root->right = new TreeNode(9); root->left->left = new TreeNode(13); root->left->right = new TreeNode(12); root->right->left = new TreeNode(13); root->right->right = new TreeNode(8);
ผลลัพธ์
3