สมมุติว่าเรามีไบนารีทรีและงานคือตรวจสอบว่าสร้างสมมาตรของตัวมันเองหรือไม่ ต้นไม้ไบนารีสมมาตรสร้างภาพสะท้อนของตัวเอง
ตัวอย่าง
อินพุต-1:
ผลลัพธ์:
True
คำอธิบาย:
เนื่องจากไบนารีทรีที่กำหนดจะสร้างภาพสะท้อนของตัวมันเอง ผลลัพธ์ที่ได้จึงเป็น True
อินพุต-2:
ผลลัพธ์:
False
คำอธิบาย:
เนื่องจากไบนารีทรีที่ให้มาไม่ได้สร้างภาพสะท้อนของตัวเอง จึงไม่สมมาตร
แนวทางในการแก้ปัญหานี้
ต้นไม้ไบนารีสมมาตรคือต้นไม้ที่เป็นภาพสะท้อนของมันเอง ซึ่งหมายความว่าเราต้องตรวจสอบว่าโหนดซ้ายและขวาของต้นไม้เหมือนกันหรือไม่
ฟังก์ชันบูลีนจะตรวจสอบโหนดด้านซ้ายและโหนดด้านขวาในขั้นต้น หากโหนดว่างเปล่าหรือเป็น NULL โหนดจะคืนค่าเป็น True สำหรับกรณีอื่นๆ เราจะตรวจสอบว่ามีรายการย่อยด้านซ้ายหรือด้านขวา จากนั้นจะต้องเหมือนกันเพื่อให้เป็นต้นไม้สมมาตร
- นำ Binary Tree ที่มีรากและลูกของมัน
- ตัวช่วยฟังก์ชันตัวช่วยบูลีน (node*root1, node*root2) รับสองรูตของทรีเดียวกัน ซึ่งช่วยตรวจสอบว่าลูกด้านซ้ายและชายด์ด้านขวาเหมือนกันหรือไม่
- ถ้าต้นไม้ว่างเปล่าหรือ NULL เราจะคืนค่า 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 helper(struct treenode * root1, struct treenode * root2) {
if (root1 == NULL and root2 == NULL)
return true;
if (root1 and root2 and root1 -> data == root2 -> data)
return (helper(root1 -> left, root2 -> right) and helper(root1 -> right, root2 -> left));
return false;
}
bool isSymmetry(struct treenode * root) {
return helper(root, root);
}
int main() {
struct treenode * root = NULL;
root = createNode(4);
root -> left = createNode(2);
root -> right = createNode(2);
root -> left -> right = createNode(7);
root -> left -> left = createNode(5);
root -> right -> left = createNode(5);
root -> right -> right = createNode(7);
if (isSymmetry(root)) {
cout << "True" << endl;
} else {
cout << "False" << endl;
}
return 0;
} การเรียกใช้โค้ดด้านบนจะสร้างผลลัพธ์เป็น
ผลลัพธ์
False
คำอธิบาย:
เนื่องจากต้นไม้ที่ระบุไม่สมมาตร เราจึงได้ผลลัพธ์เป็นเท็จ