কম্পিউটার

C++ এ বাইনারি ট্রি দীর্ঘতম ধারাবাহিক ক্রম II


ধরুন আমাদের একটি বাইনারি গাছ আছে; আমাদের সেই বাইনারি ট্রিতে দীর্ঘতম ধারাবাহিক পথের দৈর্ঘ্য খুঁজে বের করতে হবে। এখানে পথ বাড়তে বা কমতে পারে। সুতরাং উদাহরণ হিসাবে [1,2,3,4] এবং [4,3,2,1] উভয়কেই একটি বৈধ পথ হিসাবে বিবেচনা করা হয়, কিন্তু পথ [1,2,4,3] একটি বৈধ নয়৷

অন্যথায়, পথটি শিশু-পিতা-মাতা-সন্তানের ক্রমানুসারে হতে পারে, যেখানে পিতামাতা-সন্তানের ক্রম আবশ্যক নয়।

সুতরাং, যদি ইনপুট মত হয়

C++ এ বাইনারি ট্রি দীর্ঘতম ধারাবাহিক ক্রম II

তাহলে আউটপুট হবে 3 কারণ দীর্ঘতম একটানা পথ হবে [1, 2, 3] বা [3, 2, 1]।

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

  • একটি ফাংশন সংজ্ঞায়িত করুন solveUtil(), এটি নোড নেবে,

  • যদি নোডটি শূন্য হয়, তাহলে −

    • { 0, 0 }

      ফেরত দিন
  • left =solveUtil(নোডের বামে)

  • left =solveUtil(নোডের ডানদিকে)

  • এক জোড়া তাপমাত্রা সংজ্ঞায়িত করুন :={1,1}

  • যদি নোডের বাঁদিকে উপস্থিত থাকে এবং নোডের বাম দিকের মান নোড + 1-এর মানের সমান হয়, তাহলে −

    • temp.first :=সর্বাধিক temp.first এবং 1 + left.first

    • উত্তর :=সর্বাধিক উত্তর এবং temp.first

  • যদি নোডের ডানদিকে থাকে এবং নোডের ডানের মান নোড + 1-এর মানের সমান হয়, তাহলে −

    • temp.first :=সর্বাধিক temp.first এবং 1 + right.first

    • উত্তর :=সর্বাধিক উত্তর এবং temp.first

  • যদি নোডের বাম অংশ উপস্থিত থাকে এবং নোডের বাম দিকের মান নোড - 1-এর মানের সমান হয়, তাহলে −

    • temp.second :=সর্বাধিক temp.second এবং 1 + left.second

    • উত্তর :=সর্বোচ্চ উত্তর এবং temp.second

  • যদি নোডের ডানদিকে উপস্থিত থাকে এবং নোডের ডানের মান নোড - 1-এর মানের সমান হয়, তাহলে −

    • temp.second :=সর্বোচ্চ temp.second এবং 1 + right.second

    • উত্তর :=সর্বোচ্চ উত্তর এবং temp.second

  • উত্তর :=সর্বাধিক { ans এবং temp.first + temp.second - 1 }

  • রিটার্ন টেম্প

  • প্রধান পদ্ধতি থেকে নিম্নলিখিতগুলি করুন -

  • উত্তর :=0

  • solveUtil(root)

  • উত্তর ফেরত দিন

উদাহরণ

আরো ভালোভাবে বোঝার জন্য নিচের বাস্তবায়নটি দেখি -

#include <bits/stdc++.h>
using namespace std;
class TreeNode{
public:
   int val;
   TreeNode *left, *right;
   TreeNode(int data){
      val = data;
      left = NULL;
      right = NULL;
   }
};
class Solution {
public:
   int ans = 0;
   pair<int, int> solveUtil(TreeNode* node){
      if (!node) {
         return { 0, 0 };
      }
      pair<int, int> left = solveUtil(node->left);
      pair<int, int> right = solveUtil(node->right);
      pair<int, int> temp = { 1, 1 };
      if (node->left && node->left->val == node->val + 1) {
         temp.first = max(temp.first, 1 + left.first);
         ans = max(ans, temp.first);
      }
      if (node->right && node->right->val == node->val + 1) {
         temp.first = max(temp.first, 1 + right.first);
         ans = max(ans, temp.first);
      }
      if (node->left && node->left->val == node->val - 1) {
         temp.second = max(temp.second, 1 + left.second);
         ans = max(ans, temp.second);
      }
      if (node->right && node->right->val == node->val - 1) {
         temp.second = max(temp.second, 1 + right.second);
         ans = max(ans, temp.second);
      }
      ans = max({ ans, temp.first + temp.second - 1 });
      return temp;
   }
   int longestConsecutive(TreeNode* root){
      ans = 0;
      solveUtil(root);
      return ans;
   }
};
main(){
   Solution ob;
   TreeNode *root = new TreeNode(2);
   root->left = new TreeNode(1);
   root->right = new TreeNode(3);
   cout << (ob.longestConsecutive(root));
}

ইনপুট

TreeNode *root = new TreeNode(2);
root->left = new TreeNode(1);
root->right = new TreeNode(3);

আউটপুট

3

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

  2. C++ এ বাইনারি ট্রির সর্বোচ্চ প্রস্থ

  3. C++ এ সর্বাধিক বাইনারি ট্রি

  4. C++ এ বাইনারি ট্রি থেকে বাইনারি সার্চ ট্রি কনভার্সন