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