Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ตรวจสอบว่าสตริงเป็นลำดับที่ถูกต้องจากรูทไปยังเส้นทางออกจากทรีไบนารีใน C++ . หรือไม่


สมมติว่าเรามีไบนารีทรีที่แต่ละเส้นทางเดินทางจากรูทไปยังลีฟในรูปแบบลำดับที่ถูกต้อง เราต้องตรวจสอบว่าสตริงที่กำหนดเป็นลำดับที่ถูกต้องในไบนารีทรีดังกล่าวหรือไม่

เราจะได้สตริงที่กำหนดจากการต่ออาร์เรย์ของจำนวนเต็ม arr และการต่อกันของค่าทั้งหมดของโหนดตามพาธส่งผลให้มีลำดับ

สมมติว่าเรามีต้นไม้ไบนารีเช่น

ตรวจสอบว่าสตริงเป็นลำดับที่ถูกต้องจากรูทไปยังเส้นทางออกจากทรีไบนารีใน C++ . หรือไม่

ดังนั้น ถ้า arr =[0,1,0,1] ผลลัพธ์จะเป็น True เนื่องจากเส้นทาง 0 -> 1 -> 0 -> 1 เป็นลำดับที่ถูกต้อง (สีเขียว) ลำดับที่ถูกต้องอื่น ๆ จะเป็น :0 -> 1 -> 1 -> 0 , 0 -> 0 -> 0

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • กำหนดฟังก์ชัน Solve() ซึ่งจะใช้โหนด, อาร์เรย์ v, idx เริ่มต้นด้วย 0

  • ถ้าโหนดเป็นโมฆะ −

    • คืนค่าเท็จ

  • ถ้า idx>=ขนาดของ v แล้ว −

    • คืนค่าเท็จ

  • ถ้า val ของโหนดไม่เท่ากับ v[idx] ดังนั้น −

    • คืนค่าเท็จ

  • ถ้าโหนดไม่มีลูก −

    • คืนค่าจริงเมื่อ idx ==ขนาดของ v

  • คืนค่าแก้ (ด้านซ้ายของโหนด, v, idx + 1)

  • จากวิธีหลักให้ทำดังต่อไปนี้ -

  • ส่งคืนการแก้ (root, arr)

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

#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:
   bool solve(TreeNode* node, vector <int>& v, int idx = 0){
      if(!node) return false;
      if(idx >= v.size()) return false;
      if(node->val != v[idx]) return false;
      if(!node->left && !node->right){
         return idx == v.size() - 1;
      }
      return solve(node->left, v, idx + 1) || solve(node->right, v, idx + 1);
   }
   bool isValidSequence(TreeNode* root, vector<int>& arr) {
      return solve(root, arr);
   }
};
main(){
   TreeNode *root = new TreeNode(0);
   root->left = new TreeNode(1); root->right = new TreeNode(0);
   root->left->left = new TreeNode(0); root->left->right = new
   TreeNode(1);
   root->right->left = new TreeNode(0);
   root->left->left->right = new TreeNode(1);
   root->left->right->left = new TreeNode(0); root->left->right->right = new TreeNode(0);
   Solution ob;
   vector<int> v = {0,1,0,1};
   cout << (ob.isValidSequence(root, v));
}

อินพุต

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

ผลลัพธ์

1