สมมติว่ามี binary tree เราต้องตรวจสอบว่าสามารถหาความยาวของ longest consecutive sequence path ได้หรือไม่ ถ้า path หมายถึงลำดับของโหนดจากโหนดเริ่มต้นไปยังโหนดใดๆ ในต้นไม้ตามการเชื่อมต่อ parent-child longest consecutive path ต้องเป็น parent ไป child แต่ไม่ใช่ย้อนกลับ
เช่น ถ้าอินพุทเป็นแบบ

ผลลัพธ์จะเป็น 3 เนื่องจาก Longest consecutive sequence path คือ 3-4-5 ดังนั้นคืนค่า 3
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนดังนี้ −
กำหนดฟังก์ชัน solveUtil() รับ node, prev, len เริ่มต้นที่ 1
ถ้า node เป็น null แล้ว −
คืนค่า
ถ้า prev + 1 เท่ากับค่าของ node แล้ว −
เพิ่ม len ขึ้น 1
ans := สูงสุดของ ans และ len
solveUtil(left ของ node, ค่าของ node, len)
solveUtil(right ของ node, ค่าของ node, len)
มิฉะนั้น
solveUtil(left ของ node, ค่าของ node, 1)
solveUtil(right ของ node, ค่าของ node, 1)
กำหนดฟังก์ชัน solve() รับ A
ans := 1
solveUtil(A, -infinity)
คืนค่า ans
จากเมธอดหลักทำดังนี้ −
ถ้า root เป็น null แล้ว −
คืนค่า 0
คืนค่า solve(root)
ตัวอย่าง
ลองดูการติดตั้งต่อไปนี้เพื่อให้เข้าใจได้ดีขึ้น −
#include <bits/stdc++.h> using namespace std; class TreeNode{ public: int val; TreeNode *left, *right; TreeNode(int data){ val = data; left = NULL; right = NULL; } }; void insert(TreeNode **root, int val){ queue<TreeNode*> q; q.push(*root); while(q.size()){ TreeNode *temp = q.front(); q.pop(); if(!temp->left){ if(val != NULL) temp->left = new TreeNode(val); else temp->left = new TreeNode(0); return; }else{ q.push(temp->left); } if(!temp->right){ if(val != NULL) temp->right = new TreeNode(val); else temp->right = new TreeNode(0); return; }else{ q.push(temp->right); } } } TreeNode *make_tree(vector<int> v){ TreeNode *root = new TreeNode(v[0]); for(int i = 1; i<v.size(); i++){ insert(&root, v[i]); } return root; } class Solution { public: int ans; void solveUtil(TreeNode* node, int prev, int len = 1){ if (!node) return; if (prev + 1 == node->val) { len++; ans = max(ans, len); solveUtil(node->left, node->val, len); solveUtil(node->right, node->val, len); } else { solveUtil(node->left, node->val, 1); solveUtil(node->right, node->val, 1); } } int solve(TreeNode* A){ ans = 1; solveUtil(A, INT_MIN); return ans; } int longestConsecutive(TreeNode* root){ if (!root) return 0; return solve(root); } }; main(){ Solution ob; TreeNode *root = new TreeNode(1); root->right = new TreeNode(3); root->right->left = new TreeNode(2); root->right->right = new TreeNode(4); root->right->right->right = new TreeNode(5); cout << (ob.longestConsecutive(root)); } อินพุท
TreeNode *root = new TreeNode(1); root->right = new TreeNode(3); root->right->left = new TreeNode(2); root->right->right = new TreeNode(4); root->right->right->right = new TreeNode(5);
เอาต์พุท
3