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

Postorder ตัวตายตัวแทนของ Node ใน Binary Tree ใน C++


ในปัญหานี้ เราจะได้รับไบนารีทรีและโหนด หน้าที่ของเราคือพิมพ์ลำดับหลังของโหนดในทรีไบนารี

ไบนารี ต้นไม้ เป็นต้นไม้ชนิดพิเศษที่แต่ละโหนดสามารถมีโหนดย่อยได้สูงสุด 2 โหนด

Postorder ตัวตายตัวแทนของ Node ใน Binary Tree ใน C++

การข้ามผ่านของการสั่งซื้อทางไปรษณีย์ เป็นเทคนิคการสำรวจต้นไม้ โดยที่ทรีย่อยทางซ้ายแรกมีการสำรวจมากกว่าทรีย่อยทางขวา และรากจะข้ามไปในตอนท้าย

การข้ามผ่านคำสั่งของต้นไม้ด้านบน: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