मान लीजिए कि हमारे पास एक बाइनरी ट्री, एक लक्ष्य नोड और एक मान K है। हमें उन सभी नोड्स के मानों की एक सूची ढूंढनी है, जिनकी लक्ष्य नोड से दूरी K है।
इसलिए, यदि इनपुट रूट =[3,5,1,6,2,0,8, नल, नल, 7,4], लक्ष्य =5, के =2 जैसा है, तो आउटपुट [7,4 होगा ,1], ऐसा इसलिए है क्योंकि लक्ष्य नोड से दूरी 2 वाले नोड्स के मान 7, 4 और 1 हैं।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
फ़ंक्शन dfs() को परिभाषित करें, यह नोड लेगा, इसे NULL के साथ प्रारंभ करें,
-
यदि नोड शून्य है, तो -
-
वापसी
-
-
माता-पिता [नोड] :=पा
-
dfs (नोड के बाएं, नोड)
-
dfs (नोड का दायां, नोड)
-
मुख्य विधि से निम्न कार्य करें -
-
एक सरणी को परिभाषित करें ans
-
dfs(रूट)
-
(नोड, मान) जोड़ी के लिए एक कतार q परिभाषित करें
-
q में { लक्ष्य, 0 } डालें
-
देखे गए नाम के एक सेट को परिभाषित करें
-
विज़िट किए गए लक्ष्य में डालें
-
जबकि (नहीं q खाली है), करें -
-
एक जोड़ी p परिभाषित करें:=q का पहला तत्व
-
q से तत्व हटाएं
-
स्तर :=अस्थायी का दूसरा तत्व
-
नोड =अस्थायी का पहला तत्व।
-
यदि स्तर k के समान है, तो -
-
उत्तर के अंत में नोड का मान डालें
-
-
यदि नोड का बायां भाग शून्य नहीं है और स्तर + 1 <=k और बाएं नोड का दौरा नहीं किया जाता है, तो
-
{नोड के बाएं, स्तर + 1}) को q
. में डालें -
नोड के बाईं ओर देखे गए सेट में डालें
-
-
यदि नोड का दायां शून्य नहीं है और स्तर + 1 <=k और नोड का दायां नहीं देखा जाता है, तो
-
q में {नोड का दायां, स्तर + 1}) डालें
-
नोड के दाईं ओर विज़िट किए गए सेट में डालें
-
-
यदि माता-पिता [नोड] NULL नहीं है और स्तर + 1 <=k और माता-पिता [नोड] का दौरा नहीं किया गया है, तो -
-
q में { पैरेंट [नोड], लेवल + 1 } डालें
-
माता-पिता [नोड] को विज़िट में डालें
-
-
-
वापसी उत्तर
उदाहरण
आइए एक बेहतर समझ प्राप्त करने के लिए निम्नलिखित कार्यान्वयन देखें -
#include <bits/stdc++.h> using namespace std; void print_vector(vector<int> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } 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: map <TreeNode*, TreeNode*> parent; void dfs(TreeNode* node, TreeNode* pa = NULL){ if (!node) return; parent[node] = pa; dfs(node->left, node); dfs(node->right, node); } vector<int> distanceK(TreeNode* root, TreeNode* target, int k) { vector<int> ans; parent.clear(); dfs(root); queue<pair<TreeNode*, int> > q; q.push({ target, 0 }); set<TreeNode*> visited; visited.insert(target); while (!q.empty()) { pair<TreeNode*, int> temp = q.front(); q.pop(); int level = temp.second; TreeNode* node = temp.first; if (level == k) { ans.push_back(node->val); } if ((node->left && node->left->val != 0) && level + 1 <= k && !visited.count(node->left)) { q.push({ node->left, level + 1 }); visited.insert(node->left); } if ((node->right && node->right->val != 0) && level + 1 <= k && !visited.count(node->right)){ q.push({ node->right, level + 1 }); visited.insert(node->right); } if (parent[node] != NULL && level + 1 <= k && !visited.count(parent[node])) { q.push({ parent[node], level + 1 }); visited.insert(parent[node]); } } return ans; } }; main(){ Solution ob; vector<int> v = {3,5,1,6,2,0,8,NULL,NULL,7,4}; TreeNode *root = make_tree(v); TreeNode *target = root->left; print_vector(ob.distanceK(root, target, 2)); }
इनपुट
{3,5,1,6,2,0,8,NULL,NULL,7,4}
आउटपुट
[7, 4, 1, ]