ในไบนารีทรี แต่ละโหนดมีลูกสองคน นั่นคือ ลูกซ้ายและลูกขวา สมมติว่าเรามีไบนารีทรีสองต้น และภารกิจคือตรวจสอบว่าได้ต้นไม้ต้นใดต้นหนึ่งได้จากการพลิกต้นไม้อื่นทางซ้ายของต้นไม้นั้นหรือไม่
ต้นไม้จะเป็นแบบ Isomorphic หากสามารถรับได้จากการพลิกต้นไม้อีกต้นหนึ่งทางด้านซ้ายของต้นไม้
ตัวอย่าง
อินพุต-1
ผลลัพธ์: ไอโซมอร์ฟิค
คำอธิบาย: สามารถหา Tree-2 ที่ให้มาได้โดยพลิก Tree-1 ไปทางซ้าย ดังนั้น Tree จึงมี isomorphic
แนวทางในการแก้ปัญหานี้
วิธีการแบบเรียกซ้ำในการแก้ปัญหานี้คือฟังก์ชันบูลีนจะตรวจสอบโหนดรากของต้นไม้ทั้งสอง หากรากของต้นไม้ทั้งสองว่างเปล่าหรือเป็น NULL ให้คืนค่า True และตรวจซ้ำว่ารากทั้งสองมีข้อมูลเดียวกันหรือไม่ จากนั้นเราจะตรวจสอบโหนดซ้ายและขวาของต้นไม้ซ้ำๆ
- สร้างโหนดสำหรับต้นไม้ไบนารีสองต้น
- ฟังก์ชันบูลีน isIsomorphicTree(node*r1, node*r2) รับรากของต้นไม้สองต้นและส่งคืนถ้าต้นไม้นั้นเป็น Isomorphic หรือไม่
- ในขั้นต้น หากต้นไม้ว่างเปล่าหรือไม่มีโหนดในนั้น ให้คืนค่า True
- หากทรีย่อยที่รูทแล้วไม่ได้ถูกพลิกและหากทั้งสองถูกพลิก ให้คืนค่า True
ตัวอย่าง
#include<bits/stdc++.h>
using namespace std;
struct treenode {
int data;
treenode * left;
treenode * right;
};
struct treenode * createNode(int d) {
struct treenode * root = new treenode;
root -> data = d;
root -> left = NULL;
root -> right = NULL;
return root;
}
bool isIsomorphicTree(treenode * r1, treenode * r2) {
if (r1 == NULL and r2 == NULL) {
return true;
}
if (r1 == NULL or r2 == NULL) {
return false;
}
return (r1 -> data == r2 -> data && ((isIsomorphicTree(r1 -> left, r2 -> right) && isIsomorphicTree(r1 -> right, r2 -> left)) || (isIsomorphicTree(r1 -> left, r2 -> left) && isIsomorphicTree(r1 -> right, r2 -> right))));
}
int main() {
struct treenode * r1 = createNode(1);
r1 -> left = createNode(2);
r1 -> right = createNode(3);
r1 -> left -> left = createNode(4);
r1 -> left -> right = createNode(5);
r1 -> right -> left = createNode(6);
r1 -> left -> right -> left = createNode(7);
r1 -> left -> right -> right = createNode(8);
struct treenode * r2 = createNode(1);
r2 -> left = createNode(3);
r2 -> right = createNode(2);
r2 -> right -> left = createNode(4);
r2 -> right -> right = createNode(5);
r2 -> left -> right = createNode(6);
r2 -> right -> right -> left = createNode(8);
r2 -> right -> right -> right = createNode(7);
if (isIsomorphicTree(r1, r2)) {
cout << "Isomorphic" << endl;
} else {
cout << "Not an Isomorphic" << endl;
}
return 0;
} การเรียกใช้โค้ดด้านบนจะสร้างผลลัพธ์เป็น
ผลลัพธ์
Isomorphic
คำอธิบาย: สามารถหาต้นไม้ที่ให้มาได้โดยพลิกอีกต้นไปทางซ้าย จึงเป็น Isomorphic