ให้ต้นไม้ไบนารี ภารกิจคือสลับโหนดลีฟเป็นคู่ ตัวอย่างเช่น −
อินพุต -

เอาท์พุต -

เราจะติดตามตัวชี้สองตัวที่ชี้ไปยังโหนดปลายทั้งสองที่อยู่ติดกัน และสลับค่าของพวกมันในปัญหาที่กำหนด
แนวทางในการหาแนวทางแก้ไข
ในแนวทางนี้ เราสำรวจต้นไม้ ค้นหาโหนดของใบไม้ และติดตามตัวนับของเราเพื่อตรวจสอบจำนวนปัจจุบัน เคล็ดลับหลักคือตัวนับของเราเป็นเลขคี่ ดังนั้นตัวชี้แรกของเราจึงชี้ไปที่โหนดนั้นในตอนนี้ เมื่อตัวนับของเรากลายเป็นคู่ เราจะสลับข้อมูล และด้วยเหตุนี้โหนดปลายสุดของเราจึงถูกสลับ
ตัวอย่าง
รหัส C++ สำหรับแนวทางข้างต้น
#include <bits/stdc++.h>
using namespace std;
struct Node{ // structure of our tree node
int data;
struct Node *left, *right;
};
void Swap(Node **a, Node **b){ // the swapping utility function
Node * temp = *a;
*a = *b;
*b = temp;
}
/********Pointers for leaf nodes for swapping********/
Node **firstleaf;
Node **secondleaf;
void SwapTheLeafNodes(Node **root, int &count){//recursive function for
//Swapping leaf nodes
if (!(*root)) // if root is null we return
return;
if(!(*root)->left &&!(*root)->right){ // condition for leaf node
secondleaf = root; // now we firstly make our second pointer point to this node
count++; // we also increment the count
if (count%2 == 0) // now if our count is even that means we have a pair so we can swap them
Swap(firstleaf, secondleaf);
else // if count is odd so that means we only got first node yet
firstleaf = secondleaf;
}
if ((*root)->left)
SwapTheLeafNodes(&(*root)->left, count);
if ((*root)->right)
SwapTheLeafNodes(&(*root)->right, count);
}
Node* newNode(int data){ // function for initializing new node
Node *temp = new Node;
temp->data = data;
temp->left = temp->right = NULL;
return temp;
}
void printInorder(Node* node){ // inorder traversal function
if (node == NULL)
return;
printInorder(node->left);
printf("%d ", node->data);
printInorder(node->right);
}
int main(){
/* Creating binary tree*/
Node *root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->right->left = newNode(5);
root->right->right = newNode(8);
root->right->left->left = newNode(6);
root->right->left->right = newNode(7);
root->right->right->left = newNode(9);
root->right->right->right = newNode(10);
cout << "Inorder traversal before swap:\n";
printInorder(root);
cout << "\n";
int count = 0; // out counter for keeping track of leaf nodes
SwapTheLeafNodes(&root, count); // swapping the nodes
cout << "Inorder traversal after swap:\n";
printInorder(root);
cout << "\n";
return 0;
} ผลลัพธ์
Inorder traversal before swap: 4 2 1 6 5 7 3 9 8 10 Inorder traversal after swap: 6 2 1 4 5 9 3 7 8 10
คำอธิบายของโค้ดด้านบน
ในแนวทางข้างต้น เราเพียงแค่สร้างตัวชี้สองตัวที่จะติดตามโหนดปลายสุดของเรา เราสำรวจต้นไม้เมื่อเราพบโหนดใบ ขั้นแรก ให้ตัวชี้ตัวที่สองชี้ไปที่โหนดนั้น ตอนนี้เราเพิ่มตัวแปรการนับตอนนี้ถ้าการนับของเราเป็นคู่ ดังนั้นเราจึงสลับโหนดและหากการนับเป็นเลขคี่ นั่นหมายความว่าเราพบเพียงองค์ประกอบแรกของคู่ของเราเท่านั้น เราจึง เก็บค่านั้นไว้ในตัวชี้แรก และนี่คือวิธีการทำงานของฟังก์ชันของเรา
บทสรุป
ในบทช่วยสอนนี้ เราจะแก้ปัญหาของโหนดลีฟ Pairwise Swap ในไบนารีทรี นอกจากนี้เรายังได้เรียนรู้โปรแกรม C ++ สำหรับปัญหานี้และแนวทางที่สมบูรณ์ ( Normal และ มีประสิทธิภาพ ) โดยที่เราแก้ไขปัญหานี้ เราสามารถเขียนโปรแกรมเดียวกันในภาษาอื่นๆ เช่น C, java, python และภาษาอื่นๆ เราหวังว่าคุณจะพบว่าบทช่วยสอนนี้มีประโยชน์