मान लीजिए हमारे पास एक बाइनरी ट्री है; हमें यह जांचना होगा कि क्या हम सबसे लंबे क्रमागत अनुक्रम पथ की लंबाई ज्ञात कर सकते हैं। यदि पथ माता-पिता-बच्चे कनेक्शन के साथ पेड़ में किसी भी नोड से कुछ शुरुआती नोड से नोड्स के किसी अनुक्रम को संदर्भित करता है। माता-पिता से बच्चे तक लगातार सबसे लंबे रास्ते की जरूरत है, लेकिन उल्टा नहीं।
तो, अगर इनपुट पसंद है,
तो आउटपुट 3 होगा, क्योंकि सबसे लंबा क्रमागत अनुक्रम पथ 3-4-5 है, इसलिए वापसी 3.
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
एक फ़ंक्शन को हल करें परिभाषित करें (), यह नोड लेगा, पिछला, लेन इसे 1 के साथ प्रारंभ करेगा,
-
यदि नोड शून्य है, तो -
-
वापसी
-
-
यदि पिछला + 1 नोड के मान के समान है, तो -
-
(लेन को 1 से बढ़ाएं)
-
उत्तर :=अधिकतम उत्तर और लेन
-
SolveUtil(नोड के बाएँ, नोड का मान, लेन)
-
SolveUtil(नोड का दायां, नोड का वैल, लेन)
-
-
अन्यथा
-
हल करें (नोड के बाएं, नोड का वैल, 1)
-
SolveUtil(नोड का दायां, नोड का मान, 1)
-
-
एक फ़ंक्शन हल करें () को परिभाषित करें, इसमें A,
. लगेगा -
उत्तर :=1
-
हल यूटिल (ए, -इनफिनिटी)
-
वापसी उत्तर
-
मुख्य विधि से निम्न कार्य करें -
-
यदि रूट शून्य है, तो -
-
वापसी 0
-
-
वापसी हल (रूट)
उदाहरण
आइए एक बेहतर समझ प्राप्त करने के लिए निम्नलिखित कार्यान्वयन देखें -
#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