การตรวจสอบต้นไม้แบนารีสมบูรณ์ (Check Completeness of a Binary Tree)
ต้นไม้แบนารีสมบูรณ์ (Complete Binary Tree) ระดับ n จะมี n-1 ระดับที่เต็มสมบูรณ์ และโหนดในระดับ n จะถูกเติมจากซ้ายไปขวาโดยไม่มีช่องว่าง
ตัวอย่าง: ต้นไม้ [1,2,3,4,5,6] เป็นต้นไม้สมบูรณ์ ผลลัพธ์คือ true (1)
ขั้นตอนการแก้ปัญหา (BFS)
- ถ้าต้นไม้ว่าง คืนค่า true
- สร้างคิว
qใส่รากเข้าไป - กำหนด
flag := true(บ่งชี้ว่ายังไม่เจอโหนดที่ขาด) - วนลูปในขณะที่คิวไม่ว่าง:
sz := q.size()- วน
szรอบ:- นำโหนดออกจากคิว (
node) - ถ้า
node.leftมีอยู่:- ถ้า
flag == trueใส่node.leftเข้าคิว มิฉะนั้นคืนค่า false
- ถ้า
- มิฉะนั้น
flag := false - ถ้า
node.rightมีอยู่:- ถ้า
flag == trueใส่node.rightเข้าคิว มิฉะนั้นคืนค่า false
- ถ้า
flag := falsesz--
- นำโหนดออกจากคิว (
- คืนค่า true
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
class TreeNode {
public:
int val;
TreeNode *left, *right;
TreeNode(int data) { val = data; left = NULL; right = NULL; }
};
class Solution {
public:
bool isCompleteTree(TreeNode* root) {
if (!root) return true;
queue<TreeNode*> q;
q.push(root);
bool isComplete = true;
while (!q.empty()) {
int sz = q.size();
while (sz--) {
TreeNode* node = q.front(); q.pop();
if (node->left) {
if (isComplete) q.push(node->left);
else return false;
} else isComplete = false;
if (node->right) {
if (isComplete) q.push(node->right);
else return false;
} else isComplete = false;
}
}
return true;
}
};
อินพุทและเอาต์พุทตัวอย่าง
Input: {1,2,3,4,5,6}
Output: 1 (true)