কম্পিউটার

C++ এ বাইনারি ট্রিতে দীর্ঘতম জিগজ্যাগ পথ


ধরুন আমাদের একটি বাইনারি ট্রি রুট আছে, বাইনারি গাছের জন্য একটি জিগজ্যাগ পাথ অনুসরণ করা হয়েছে −

  • বাইনারি ট্রিতে যেকোনো নোড এবং একটি দিক (হয় ডান বা বাম) বেছে নিন।

  • যদি বর্তমান দিকটি সঠিক হয় তবে বর্তমান নোডের ডান চাইল্ডের দিকে অগ্রসর হবে অন্যথায় বাম শিশুর দিকে যান৷

  • তারপরে ডান থেকে বামে বা বিপরীত দিক পরিবর্তন করুন।

  • দ্বিতীয় এবং তৃতীয় ধাপগুলি পুনরাবৃত্তি করুন যতক্ষণ না আমরা গাছে নড়াচড়া করতে পারি।

এখানে জিগজ্যাগ দৈর্ঘ্যকে পরিদর্শন করা নোডের সংখ্যা হিসাবে সংজ্ঞায়িত করা হয়েছে - 1। (একটি একক নোডের দৈর্ঘ্য 0)। আমাদের সেই গাছের মধ্যে থাকা দীর্ঘতম জিগজ্যাগ পথটি খুঁজে বের করতে হবে। সুতরাং উদাহরণস্বরূপ, যদি গাছটি −

এর মত হয়

C++ এ বাইনারি ট্রিতে দীর্ঘতম জিগজ্যাগ পথ

আউটপুট হবে 3, যেমন (ডান, বাম, ডান)

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -

  • dfs() নামক একটি পদ্ধতি সংজ্ঞায়িত করুন, এটি রুট এবং leftB

    নেবে
  • যদি রুট শূন্য হয়, তাহলে -1

    রিটার্ন করুন
  • যদি গাছে root শুধুমাত্র একটি নোড হয়, তাহলে 0

    রিটার্ন করুন
  • leftV :=dfs (মূলের বাম, সত্য) এবং rightV :=dfs (মূলের ডান, মিথ্যা)

  • ret :=ret এর সর্বোচ্চ এবং (1 + লেফটভি এবং ডানভির সর্বোচ্চ)

  • যদি leftB 0 না হয়, তাহলে 1 + rightV দিন, অন্যথায় 1 + leftV

    দিন
  • মূল পদ্ধতি থেকে, ret :=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++ এ বাইনারি সার্চ ট্রি থেকে গ্রেটার সাম ট্রি

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

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

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