কম্পিউটার টিউটোরিয়াল

C++-এ বাইনারি ট্রিতে লংগেস্ট জিগজ্যাগ পাথ খুঁজে বের করা


ধরুন আমাদের একটি বাইনারি ট্রি রুট আছে। একটি বাইনারি ট্রির জিগজ্যাগ পাথ নিচেরভাবে ডিফাইন করা হয় −

  • বাইনারি ট্রি-এ যেকোনো নোড এবং একটি ডিরেকশন (ডান বা বাম) বেছে নিন।

  • যতক্ষণ না ট্রিতে मूভ করা সম্ভব নয়, দ্বিতীয় ও তৃতীয় ধাপ রিপিট করুন।

এখানে জিগজ্যাগ দৈর্ঘ্য = ভিজিট করা নোডের সংখ্যা - ১। (একক নোডের দৈর্ঘ্য ০)। সেই ট্রিতে থাকা সবচেয়ে লম্বা জিগজ্যাগ পাথ বের করতে হবে। উদাহরণস্বরূপ, ট্রি নিচের মতো হলে −

C++-এ বাইনারি ট্রিতে লংগেস্ট জিগজ্যাগ পাথ খুঁজে বের করা

আউটপুট হবে ৩, কারণ (Right, Left, Right)।

সমাধানের ধাপগুলো:

  • dfs() মেথড ডিফাইন করুন, যা root এবং leftB নেবে

  • যদি root null হয়, তবে -1 রিটার্ন করুন

  • যদি root ট্রিতে একক নোড হয়, তবে 0 রিটার্ন করুন

  • leftV := dfs(root-এর লেফট, true) এবং rightV := dfs(root-এর রাইট, false)

  • ret := max(ret, 1 + max(leftV, rightV))

  • যদি leftB true হয়, তবে 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;    } }; 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++-এ Binary Search Tree to Greater Sum Tree

  2. বাইনারি ট্রি প্রুনিং C++-এ

  3. C++-এ বাইনারি ট্রিতে সর্বোচ্চ পথ যোগফল

  4. পাইথনে জিগজ্যাগ লেবেল্ড বাইনারি ট্রিতে পাথ খুঁজে বের করা