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

สั่งซื้อล่วงหน้าของโหนดใน Binary Tree ใน C++


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

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

สั่งจองล่วงหน้า เป็นวิธีที่จะลัดเลาะโหนดของต้นไม้ ในนี้เราจะสำรวจโหนดรูทก่อน จากนั้นจึงออกจากชายด์และชายด์ที่ถูกต้อง

สั่งซื้อโหนดรุ่นก่อนล่วงหน้า คือโหนดที่มาก่อนโหนดในการสั่งซื้อล่วงหน้าของโหนด

มาดูตัวอย่างทำความเข้าใจปัญหากัน

สั่งซื้อล่วงหน้าของโหนดใน Binary Tree ใน C++

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