Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ में एक बाइनरी ट्री में सबसे लंबा ज़िगज़ैग पथ

मान लीजिए कि हमारे पास एक बाइनरी ट्री रूट है, एक बाइनरी ट्री के लिए एक ज़िगज़ैग पथ को निम्नानुसार परिभाषित किया गया है -

  • बाइनरी ट्री और दिशा में कोई भी नोड चुनें (दाएं या बाएं)।

  • यदि वर्तमान दिशा सही है तो वर्तमान नोड के दाहिने बच्चे की ओर बढ़ो अन्यथा बाएं बच्चे की ओर बढ़ो।

  • फिर दिशा को दाएं से बाएं या इसके विपरीत दिशा बदलें।

  • दूसरे और तीसरे चरण को तब तक दोहराएं जब तक कि हम पेड़ में नहीं जा सकते।

यहाँ ज़िगज़ैग लंबाई को विज़िट किए गए नोड्स की संख्या के रूप में परिभाषित किया गया है - 1. (एक एकल नोड की लंबाई 0 है)। हमें उस पेड़ में निहित सबसे लंबा ज़िगज़ैग पथ खोजना होगा। तो उदाहरण के लिए, यदि पेड़ की तरह है -

C++ में एक बाइनरी ट्री में सबसे लंबा ज़िगज़ैग पथ

आउटपुट 3 होगा, जैसे (दाएं, बाएं, दाएं)

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • डीएफएस () नामक एक विधि को परिभाषित करें, यह रूट और लेफ्ट ले जाएगाबी

  • यदि रूट शून्य है, तो -1

    . लौटाएं
  • यदि पेड़ में जड़ केवल एक नोड है, तो 0

  • बायां वी:=डीएफएस (रूट के बाएं, सत्य) और दाएं वी:=डीएफएस (रूट का दायां, झूठा)

  • ret :=अधिकतम रिट और (1 + अधिकतम बाएँV और दाएँV)

  • अगर बायां बी 0 नहीं है, तो 1 + दायां वी लौटाएं, अन्यथा 1 + बाएं वी वापस करें

  • मुख्य विधि से, रिट सेट करें:=0

  • कॉल dfs(root, true) और कॉल dfs(root, false)

  • वापसी रिट

उदाहरण (C++)

आइए एक बेहतर समझ प्राप्त करने के लिए निम्नलिखित कार्यान्वयन देखें -

#include <bits/stdc++.h>
using namespace std;
class TreeNode{
   public:
   int val;
   TreeNode *left, *right;
   TreeNode(int data){
      val = data;
      left = 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;
   int dfs(TreeNode* root, bool leftB){
      if(!root) return -1;
      if(!root->left && !root->right) return 0;
      int leftV = dfs(root->left, true);
      int rightV = dfs(root->right, false);
      ret = max(ret, 1 + max(leftV, rightV));
      if(leftB) return 1 + rightV;
         return 1 + leftV;
   }
   int longestZigZag(TreeNode* root) {
      ret = 0;
      dfs(root, true);
      dfs(root, false);
      return ret;
   }
};
main(){
   vector<int> v = {1,NULL,1,1,1,NULL,NULL,1,1,NULL,1,NULL,NULL,NULL,1,NULL,1};
   TreeNode *root = make_tree(v);
   Solution ob;
   cout << (ob.longestZigZag(root));
}

इनपुट

[1,null,1,1,1,null,null,1,1,null,1,null,null,null,1,null,1]

आउटपुट

3

  1. C++ में बाइनरी ट्री प्रूनिंग

    मान लीजिए कि हमारे पास एक बाइनरी ट्री का हेड नोड रूट है, जहां अतिरिक्त रूप से प्रत्येक नोड का मान या तो 0 या 1 है। हमें वही ट्री ढूंढना है जहां प्रत्येक सबट्री जिसमें 1 नहीं है, को हटा दिया गया है। तो अगर पेड़ जैसा है - इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - एक पुनरावर्ती विधि को

  1. C++ में एक बाइनरी ट्री में अधिकतम पथ योग

    इस समस्या में, हमें एक बाइनरी ट्री दिया जाता है जिसमें प्रत्येक नोड में एक मान होता है। हमारा काम एक बाइनरी ट्री की दो पत्तियों के बीच अधिकतम पथ योग खोजने के लिए एक प्रोग्राम बनाना है। यहां, हमें एक लीफ नोड से दूसरे लीफ नोड के लिए पथ फॉर्म ढूंढना होगा जो अधिकतम मूल्यों को प्रदान करेगा। इस अधिकतम यो

  1. ज़िगज़ैग में पथ पायथन में बाइनरी ट्री लेबल किया गया

    मान लीजिए कि एक अनंत बाइनरी ट्री में जहां प्रत्येक नोड में दो बच्चे होते हैं, नोड्स को पंक्ति क्रम में लेबल किया जाता है। अब विषम संख्या वाली पंक्तियों (पहली, तीसरी, पाँचवीं,...) में, लेबलिंग बाएँ से दाएँ होती है, और सम संख्या वाली पंक्तियों (दूसरी, चौथी, छठी,...) में, लेबलिंग दाएँ से बाएँ होती है .