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

Input: 1 Output: 9
เพื่อแก้ปัญหานี้ กองทัพเรือ วิธีการคือการค้นหาการข้ามผ่านของการสั่งซื้อล่วงหน้าของไบนารีทรีแล้วพิมพ์องค์ประกอบที่มาหลังหมายเลขที่กำหนด
วิธีแก้ปัญหาที่มีประสิทธิภาพมากขึ้นจะเกี่ยวข้องกับการตรวจสอบตำแหน่งของตัวเลขที่กำหนด จากนั้นจึงค้นหาหมายเลขก่อนหน้าตามตำแหน่ง หากโหนดเป็นโหนดรูท ให้คืนค่า NULL ไม่ใช่รุ่นก่อน หากโหนดเป็นชายด์ที่ถูกต้อง ลูกด้านซ้ายจะเป็นรุ่นก่อน
โปรแกรมแสดงการดำเนินการแก้ไข
ตัวอย่าง
#include <iostream>
using namespace std;
struct Node {
struct Node *left, *right, *parent;
int key;
};
struct Node* insertNode(int key){
Node* temp = new Node;
temp->left = temp->right = temp->parent = NULL;
temp->key = key;
return temp;
}
Node* preOrderPredecessorNode(Node* root, Node* n){
if (n == root)
return NULL;
Node* parent = n->parent;
if (parent->left == NULL || parent->left == n)
return parent;
Node* curr = parent->left;
while (curr->right != NULL)
curr = curr->right;
return curr;
}
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* preOrderPredecessor = preOrderPredecessorNode(root, root->left->right);
if (preOrderPredecessor)
cout<<"Preorder Predecessor of "<<root->left->right->key<<" is "<<preOrderPredecessor->key;
else
cout<<"Preorder Predecessor of "<<root->left->right->key<<" is NULL";
return 0;
} ผลลัพธ์
Preorder Predecessor of 50 is 18