मान लीजिए कि हमारे पास एक बाइनरी ट्री है जहां नोड मान 1 से 9 तक के अंक हैं। बाइनरी ट्री में एक पथ को छद्म-पैलिंड्रोमिक कहा जाता है, जब पथ में नोड मानों का कम से कम एक क्रमपरिवर्तन एक पैलिंड्रोम होता है। हमें रूट नोड से लीफ नोड्स तक जाने वाले छद्म-पैलिंड्रोमिक पथों की संख्या ज्ञात करनी होगी।
तो, अगर इनपुट पसंद है

तब आउटपुट 2 होगा, ऐसा इसलिए है क्योंकि रूट नोड से लीफ नोड्स तक जाने वाले तीन रास्ते हैं - लाल पथ इस प्रकार है [2,3,3], हरा पथ [2,1,1] का अनुसरण करता है, और पथ [ 2,3,1]। इन पथों में से केवल लाल पथ और हरा पथ छद्म-पैलिंड्रोमिक पथ हैं क्योंकि लाल पथ [2,3,3] को [3,2,3] के रूप में पुनर्व्यवस्थित किया जा सकता है और हरे पथ [2,1,1] को पुनर्व्यवस्थित किया जा सकता है। [1,2,1] के रूप में।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
फ़ंक्शन को परिभाषित करें ठीक (), यह एक सरणी v लेगा,
-
विषम :=0
-
v −
. में प्रत्येक तत्व के लिए-
विषम :=विषम + यह और 1
-
-
जब विषम 0 हो या विषम 1 हो, तो सही लौटें, अन्यथा असत्य
-
फ़ंक्शन dfs() को परिभाषित करें, यह नोड, सरणी v,
take लेगा -
यदि नोड शून्य है, तो -
-
वापसी
-
-
v[नोड के मान] को 1 से बढ़ाएं
-
यदि नोड का बायां भाग शून्य है और नोड का दायां शून्य है, तो -
-
यदि ठीक (v) सत्य है, तो -
-
(रिटर्न 1 से बढ़ाएं)
-
-
v[नोड का मान] 1 से घटाएं
-
वापसी
-
-
dfs (नोड के बाएं, v)
-
dfs (नोड का दायां, v)
-
v[नोड का मान] 1 से घटाएं
-
मुख्य विधि से, निम्न कार्य करें -
-
रिट:=0
-
आकार 10
. की एक सरणी cnt परिभाषित करें -
डीएफएस (रूट, सीएनटी)
-
वापसी रिट
उदाहरण
आइए एक बेहतर समझ प्राप्त करने के लिए निम्नलिखित कार्यान्वयन देखें -
#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 ret;
bool ok(vector <int>& v){
int odd = 0;
for (auto& it : v) {
odd += it & 1;
}
return odd == 0 || odd == 1;
}
void dfs(TreeNode* node, vector <int>& v){
if (!node)
return;
v[node->val]++;
if (!node->left && !node->right) {
if (ok(v))
ret++;
v[node->val]--;
return;
}
dfs(node->left, v);
dfs(node->right, v);
v[node->val]--;
}
int pseudoPalindromicPaths (TreeNode* root) {
ret = 0;
vector<int> cnt(10);
dfs(root, cnt);
return ret;
}
};
main(){
Solution ob;
vector<int> v = {2,3,1,3,1,NULL,1};
TreeNode *root = make_tree(v);
cout << (ob.pseudoPalindromicPaths(root));
} इनपुट
{2,3,1,3,1,NULL,1} आउटपुट
2