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

การข้ามผ่านของการสั่งซื้อทางไปรษณีย์ เป็นเทคนิคการสำรวจต้นไม้ โดยที่ทรีย่อยทางซ้ายแรกมีการสำรวจมากกว่าทรีย่อยทางขวา และรากจะข้ามไปในตอนท้าย
การข้ามผ่านคำสั่งของต้นไม้ด้านบน:8 4 2 7 9 6
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
ป้อนข้อมูล − binary tree ในตัวอย่างด้านบน node=7
ผลผลิต − 9
คำอธิบาย − เราเห็นมันในการข้ามผ่านหลังลำดับของไบนารีทรี
ในการแก้ปัญหานี้ วิธีแก้ปัญหาที่ง่าย ง่าย และไม่ใช่วิธีง่ายๆ ก็คือการค้นหาการข้ามผ่านรายการสั่งซื้อแล้วพิมพ์หมายเลขข้างๆ ในการข้ามผ่าน
แต่เราต้องเรียนรู้วิธีแก้ปัญหาที่มีประสิทธิภาพมากขึ้น
วิธีแก้ปัญหาที่มีประสิทธิภาพจะเกี่ยวข้องกับการใช้การสังเกตทั่วไปเกี่ยวกับการข้ามผ่านของคำสั่งซื้อขาย
-
เนื่องจาก root เป็นโหนดสุดท้ายในการข้ามผ่าน postorder ตัวตายตัวแทนจึงเป็น NULL
-
ในกรณีที่โหนดปัจจุบันเป็นโหนดย่อยที่ถูกต้อง โหนดหลักจะเป็นผู้สืบทอด
-
ในกรณีที่โหนดปัจจุบันถูกปล่อยให้เป็นลูก จากนั้น
-
หากไม่มีพี่น้องที่ถูกต้อง ผู้สืบทอดคือโหนดหลัก
-
หากพี่น้องที่ถูกต้องมีอยู่ แสดงว่าโหนดหรือลูกที่อยู่ทางซ้ายสุดจะเป็นตัวตายตัวแทน
-
วิธีนี้ได้ผล เวลาซับซ้อนคือ O(h) ความสูงของต้นไม้
ตัวอย่าง
โปรแกรมแสดงการใช้งานโซลูชันของเรา
#include <iostream>
using namespace std;
struct Node {
struct Node *left, *right, *parent;
int value;
};
struct Node* insertNode(int value) {
Node* temp = new Node;
temp->left = temp->right = temp->parent = NULL;
temp->value = value;
return temp;
}
Node* findPostorderSuccessor(Node* root, Node* n) {
if (n == root)
return NULL;
Node* parent = n->parent;
if (parent->right == NULL || parent->right == n)
return parent;
Node* curr = parent->right;
while (curr->left != NULL)
curr = curr->left;
return curr;
}
int main(){
struct Node* root = insertNode(6);
root->parent = NULL;
root->left = insertNode(2);
root->left->parent = root;
root->left->left = insertNode(8);
root->left->left->parent = root->left;
root->left->right = insertNode(4);
root->left->right->parent = root->left;
root->right = insertNode(9);
root->right->parent = root;
root->right->left = insertNode(7);
root->right->left->parent = root->right;
root->left->right->left = insertNode(14);
struct Node* successorNode = findPostorderSuccessor(root, root->left->right);
if (successorNode)
cout<<"Postorder successor of "<<root->left->right->value<<" is "<<successorNode->value;
else
cout<<"Postorder successor of "<<root->left->right->value<<" is NULL";
return 0;
} ผลลัพธ์
Postorder successor of 4 is 2