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

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


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

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

  • अगर वर्तमान डायरेक्शन राइट है तो करंट नोड के राइट चाइल्ड की ओर बढ़ें अन्यथा लेफ्ट चाइल्ड की ओर बढ़ें।

  • फिर डायरेक्शन को राइट से लेफ्ट या वाइस वर्सा में बदलें।

  • दूसरे और तीसरे स्टेप्स को तब तक दोहराएं जब तक हम ट्री में मूव नहीं कर सकते।

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

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

आउटपुट 3 होगा, जैसे (राइट, लेफ्ट, राइट)

इसे हल करने के लिए, हम इन स्टेप्स को फॉलो करेंगे:

  • dfs() नाम का एक मेथड डिफाइन करें, जो root और leftB लेगा

  • अगर रूट नल है, तो -1 लौटाएं

  • अगर रूट ट्री में केवल एक नोड है, तो 0 लौटाएं

  • leftV := dfs(root का लेफ्ट, true) और rightV := dfs(root का राइट, false)

  • ret := ret और (1 + leftV और rightV का मैक्स) का मैक्स

  • अगर leftB 0 नहीं है, तो 1 + rightV लौटाएं, अन्यथा 1 + leftV लौटाएं

  • मेन मेथड से, ret := 0 सेट करें

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

  • ret लौटाएं

उदाहरण (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;
    }
};

int 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++ में बाइनरी ट्री प्रूनिंग C++ में बाइनरी ट्री प्रूनिंग

    मान लीजिए हमारे पास एक बाइनरी ट्री का हेड नोड root है, जहाँ प्रत्येक नोड का मान या तो 0 या 1 है। हमें वही ट्री लौटाना है जहाँ हर वह सबट्री हटा दी गई हो जिसमें 1 नहीं है। उदाहरण: इनपुट ट्री [1,1,0,1,1,0,1,0] के लिए, आउटपुट ट्री में केवल वही नोड्स रहेंगे जिनके सबट्री में कम से कम एक 1 है। पोस्ट-ऑर्

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

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

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

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