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

กู้คืนต้นไม้จาก Preorder Traversal ใน C++


คำอธิบายโจทย์

Preorder DFS: แสดง D dash (D=depth) ตามด้วยค่าโหนด ราก depth=0 ลูกเดียวเป็น left child เสมอ กู้คืนต้นไม้จาก string S

ตัวอย่าง

S = "1-2--3--4-5--6--7" → Tree structure

Inorder: 3 2 4 1 6 5 7

วิธีแก้ปัญหา

ใช้ Stack ติดตามโหนดปัจจุบัน:

  1. อ่าน dashes นับ depth (lvl)
  2. อ่านตัวเลข (num)
  3. Pop stack จน size == lvl (ย้อนกลับไป parent)
  4. สร้างโหนดใหม่ attach เป็น left หรือ right ของ stack top
  5. Push โหนดใหม่เข้า stack
  6. สุดท้าย pop จนเหลือ 1 → 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; }
};

void inord(TreeNode* root) {
    if(root) { inord(root->left); cout<val<<" "; inord(root->right); }
}

class Solution {
public:
    TreeNode* recoverFromPreorder(string S) {
        stack<TreeNode*> st;
        int i=0, n=S.size(), lvl=0, num=0;
        
        while(i lvl) st.pop();
            
            TreeNode* temp = new TreeNode(num);
            if(!st.empty() && !st.top()->left) st.top()->left = temp;
            else if(!st.empty()) st.top()->right = temp;
            st.push(temp);
        }
        while(st.size() > 1) st.pop();
        return st.empty() ? NULL : st.top();
    }
};

int main() {
    Solution ob;
    TreeNode* root = ob.recoverFromPreorder("1-2--3--4-5--6--7");
    inord(root);
    return 0;
}

อินพุต

"1-2--3--4-5--6--7"

เอาต์พุต

3 2 4 1 6 5 7