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

สร้างต้นไม้ไบนารีจากสตริงใน C++


สมมติว่าเรามีสตริงที่ประกอบด้วยวงเล็บและจำนวนเต็ม เราต้องสร้างต้นไม้ไบนารีจากสตริงนั้น อินพุตทั้งหมดแสดงถึงต้นไม้ไบนารี ซึ่งมีจำนวนเต็มตามด้วยศูนย์ หนึ่ง หรือสองคู่ของวงเล็บ จำนวนเต็มแสดงถึงค่าของราก และคู่ของวงเล็บแต่ละคู่มีต้นไม้ไบนารีลูกที่มีโครงสร้างเหมือนกัน

เช่น ถ้าอินพุตเป็น "4(2(3)(1))(6(5))" ผลลัพธ์จะเป็น [3,2,1,4,5,6] (การท่องไปในออร์เดอร์)

สร้างต้นไม้ไบนารีจากสตริงใน C++

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

  • กำหนดฟังก์ชัน solve() ซึ่งรับพารามิเตอร์ s และ idx

  • ถ้า idx >= ขนาดของ s แล้ว ให้คืนค่า null

  • num := สตริงว่าง

  • ทำซ้ำ while (idx < ขนาดของ s และ s[idx] ไม่ใช่ '(' และ s[idx] ไม่ใช่ ')') ให้ทำ:

    • num := num + s[idx]

    • เพิ่ม idx ขึ้น 1

  • node = โหนดใหม่ที่มีค่า num

  • ถ้า idx < ขนาดของ s และ s[idx] เป็น '(' ให้ทำ:

    • เพิ่ม idx ขึ้น 1

    • left ของ node := solve(s, idx)

    • เพิ่ม idx ขึ้น 1

    • ถ้า idx < ขนาดของ s และ s[idx] เป็น '(' ให้ทำ:

      • เพิ่ม idx ขึ้น 1

      • right ของ node := solve(s, idx)

      • เพิ่ม idx ขึ้น 1

  • คืนค่า node

  • จากเมธอดหลัก ให้ทำดังนี้:

  • idx := 0

  • temp = โหนดใหม่ที่มีค่า -1

  • คืนค่า solve(s, idx)

ตัวอย่าง (C++)

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

#include <bits/stdc++.h> using namespace std; class TreeNode{    public:       int val;       TreeNode *left, *right;       TreeNode(int data){          val = data;          left = NULL;          right = NULL;       } }; void inord(TreeNode *root){    if(root != NULL){       inord(root->left);       cout << root->val << " ";       inord(root->right);    } } class Solution { public:    TreeNode* solve(string s, int& idx){       if (idx >= s.size())          return NULL;       string num = "";       while (idx < s.size() && s[idx] != '(' && s[idx] != ')') {          num += s[idx];          idx++;       }       TreeNode* node = new TreeNode(stoi(num));       if (idx < s.size() && s[idx] == '(') {          idx++;          node->left = solve(s, idx);          idx++;          if (idx < s.size() && s[idx] == '(') {             idx++;             node->right = solve(s, idx);             idx++;          }       }       return node;    }    TreeNode* str2tree(string s) {       int idx = 0;       TreeNode* temp = new TreeNode(-1);       return solve(s, idx);    } }; main(){    Solution ob;    TreeNode *root = ob.str2tree("4(2(3)(1))(6(5))");    inord(root); }

อินพุต

"4(2(3)(1))(6(5))"

เอาต์พุต

3 2 1 4 5 6