Cho một cây nhị phân, kiểm tra xem nó có phải cây nhị phân hoàn chỉnh (complete binary tree) hay không. Cây nhị phân hoàn chỉnh cấp n có n-1 cấp hoàn chỉnh, và tất cả nút ở cấp n được điền từ trái sang phải. Ví dụ cây đầu vào cho kết quả true.
Giải thuật
- Nếu cây rỗng trả về true.
- Tạo hàng đợi
q, đưa gốc vào. flag := true.- Khi
qkhông rỗng:sz := q.size()- Khi
sz > 0:- Lấy nút
nodetừ hàng đợi. - Nếu
node->lefttồn tại:- Nếu
flagtrue thì đưa con trái vào hàng đợi, ngược lại trả về false.
- Nếu
- Ngược lại
flag := false. - Nếu
node->righttồn tại:- Nếu
flagtrue thì đưa con phải vào hàng đợi, ngược lại trả về false.
- Nếu
flag := false.sz--
- Lấy nút
- Trả về true.
Ví dụ mã 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;
}
};
Đầu vào
{1,2,3,4,5,6}
Đầu ra
1