ในปัญหานี้ เราได้รับไบนารีทรีและค่าโหนด งานของเราคือการพิมพ์ตัวต่อจากการสั่งซื้อล่วงหน้าของโหนด
ต้นไม้ไบนารี เป็นต้นไม้ชนิดพิเศษที่แต่ละโหนดรูทสามารถมีโหนดย่อยได้สูงสุด 2 โหนด
สั่งจองล่วงหน้า เป็นวิธีที่จะลัดเลาะโหนดของต้นไม้ ในนี้เราจะสำรวจโหนดรูทก่อน จากนั้นจึงออกจากชายด์และชายด์ที่ถูกต้อง
โหนดสืบทอดตำแหน่งล่วงหน้า คือโหนดที่อยู่ถัดจากโหนดในการข้ามผ่านการสั่งซื้อล่วงหน้าของโหนด
มาดูตัวอย่างทำความเข้าใจปัญหากัน
Input: 9 Output 0 Explanation: the preorder traversal of the tree is: 5 9 0 1 2 5. So the preorder successor of 9 is 0.
ในการแก้ปัญหานี้ แนวทางของกองทัพเรือคือการค้นหาการข้ามผ่านของไบนารีทรีก่อนสั่งซื้อ จากนั้นพิมพ์องค์ประกอบที่มาหลังหมายเลขที่กำหนด
วิธีแก้ปัญหาที่มีประสิทธิภาพมากขึ้นจะเกี่ยวข้องกับการตรวจสอบตำแหน่งของตัวเลขที่กำหนด จากนั้นจึงค้นหาตัวตายตัวแทนตามตำแหน่ง ดังนั้น หากตำแหน่งมีลูกด้านซ้าย ผู้สืบทอดตำแหน่งที่สั่งซื้อล่วงหน้าจะเป็นลูกที่ด้านซ้าย หากเป็นโหนดปลายสุดแต่เป็นโหนดลูก โหนดพี่น้องของโหนดจะเป็นตัวตายตัวแทนของการสั่งซื้อล่วงหน้า หากเป็นโหนดปลายสุดและไม่ใช่โหนดย่อย เราต้องเลื่อนขึ้นไปยังโหนดระดับบนสุดซึ่งโหนดย่อยจะเป็นผู้สืบทอดต่อจากการสั่งซื้อล่วงหน้า
โปรแกรมจะทำให้การแก้ปัญหาชัดเจนยิ่งขึ้น
ตัวอย่าง
#include <iostream> using namespace std; struct Node { struct Node *left, *right, *parent; int key; }; Node* insertNode(int key){ Node* temp = new Node; temp->left = temp->right = temp->parent = NULL; temp->key = key; return temp; } Node* preOrderSuccessorNode(Node* root, Node* n){ if (n->left) return n->left; Node *curr = n, *parent = curr->parent; while (parent != NULL && parent->right == curr) { curr = curr->parent; parent = parent->parent; } if (parent == NULL) return NULL; return parent->right; } int main(){ Node* root = insertNode(99); root->parent = NULL; root->left = insertNode(4); root->left->parent = root; root->left->left = insertNode(18); root->left->left->parent = root->left; root->left->right = insertNode(50); root->left->right->parent = root->left; root->right = insertNode(26); root->right->parent = root; root->right->left = insertNode(5); root->right->left->parent = root->right; root->right->right = insertNode(10); root->right->right->parent = root->right; Node* preOrder = preOrderSuccessorNode(root, root->left->right); if (preOrder) { cout<<"Preorder successor of "<<root->left->right->key<<" is "<<preOrder->key; } else { cout<<"Preorder successor of "<<root->left->right->key<<" is NULL"; } return 0; }
ผลลัพธ์
Preorder successor of 50 is 26