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

สร้าง BST จาก Preorder Traversal ที่กำหนด (ชุดที่ 2) ใน C++

คำอธิบายปัญหา

สมมติว่าเรามี preorder traversal หนึ่ง จาก traversal นี้ เราต้องสร้างต้นไม้ ดังนั้นถ้า traversal เป็น [10, 5, 1, 7, 40, 50] ต้นไม้จะเป็นดังนี้:

สร้าง BST จาก Preorder Traversal ที่กำหนด (ชุดที่ 2) ใน C++

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

  • สร้าง stack ว่าง

  • ทำนำค่าแรกเป็นราก (root) และ push เข้า stack

  • ตอนนี้ ทำการ pop ซ้ำๆ ในขณะที่ stack ไม่ว่าง และค่าถัดไปมากกว่าองค์ประกอบบนสุดของ stack ทำให้ค่านี้เป็นลูกขวาของโหนดที่ pop ล่าสุด ตอนนี้ push โหนดใหม่เข้า stack

  • เมื่อค่าถัดไปน้อยกว่าองค์ประกอบบนสุด ทำให้มันเป็นลูกซ้ายของ stack top ตอนนี้ push โหนดใหม่เข้า stack

  • ทำซ้ำขั้นตอน 2 และ 3 จนกว่าจะตรวจสอบทุกองค์ประกอบใน preorder list

ตัวอย่างโค้ด

#include <iostream> #include <stack> using namespace std; class node {    public:    int data;    node *left;    node *right; }; node* getNode (int data) {    node* temp = new node();    temp->data = data;    temp->left = temp->right = NULL;    return temp; } node* constructTree ( int pre[], int size ) {    stack<node*> stk;    node* root = getNode( pre[0] );    stk.push(root);    int i;    node* temp;    for ( i = 1; i < size; ++i ) {       temp = NULL;       while ( !stk.empty() && pre[i] > stk.top()->data ) {          temp = stk.top();          stk.pop();       }       if ( temp != NULL) {          temp->right = getNode( pre[i] );          stk.push(temp->right);       } else {          node* peek_node = stk.top();          peek_node->left = getNode( pre[i] );          stk.push(stk.top()->left);       }    }    return root; } void inord (node* node) {    if (node == NULL)       return;    inord(node->left);    cout << node->data << " ";    inord(node->right); } int main () {    int pre[] = {10, 5, 1, 7, 40, 50};    int size = sizeof( pre ) / sizeof( pre[0] );    node *root = constructTree(pre, size);    cout << "Inorder traversal: ";    inord(root); }

ผลลัพธ์

Inorder traversal: 1 5 7 10 40 50