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

XOR ของพาธระหว่างสองโหนดใดๆ ใน Binary Tree ใน C++


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

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

XOR ของพาธระหว่างสองโหนดใดๆ ใน Binary Tree ใน C++

เราต้องหา xor ของโหนดทั้งหมดระหว่าง 2 ถึง 3

เส้นทางจาก 2 ถึง 3, 2 → 6 → 1 → 3

เราจะหา 2^3^1^3.

ผลผลิต

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

ตัวอย่าง

โปรแกรมแสดงการใช้งานโซลูชันของเรา

#include <bits/stdc++.h>
using namespace std;
struct Node {
   int data;
   Node *left, *right;
};
struct Node* getNode(int data){
   struct Node* newNode = new Node;
   newNode->data = data;
   newNode->left = newNode->right = NULL;
   return newNode;
}
void pathStoD(Node* root, unordered_map<int, int>& path, int XOR){
   if (!root)
      return;
   path.insert(make_pair(root->data, XOR ^ root->data));
   XOR ^= root->data;
   if (root->left)
      pathStoD(root->left, path, XOR);
   if (root->right)
      pathStoD(root->right, path, XOR);
}
int findPathXOR(unordered_map<int, int> path, int node1, int node2){
   return path[node1] ^ path[node2];
}
int main(){
   struct Node* root = getNode(1);
   root->left = getNode(6);
   root->left->left = getNode(2);
   root->left->right = getNode(4);
   root->right = getNode(3);
   root->right->left = getNode(7);
   root->right->right = getNode(5);
   int XOR = 0;
   unordered_map<int, int> mp;
   int source = 2;
   int destination = 3;
   pathStoD(root, mp, XOR);
   cout<<"The XOR of all node from "<<source<<" to "<<destination<<" of the tree is : ";
   cout<<findPathXOR(mp, source, destination);
   return 0;
}

ผลลัพธ์

The XOR of all node from 2 to 3 of the tree is : 7