https://www.nowcoder.com/practice/8daa4dff9e36409abba2adbe413d6fae
思路:层次遍历,若前后两个结点不连续则不是完全二叉树
bool isCompleteTree(TreeNode *root) {
// 通过队列进行层次遍历
queue<TreeNode *> parents;
// 记录当前结点的下标和层次遍历中前一结点的下标,若前后两个结点不连续则不是完全二叉树
int i = 1, pre = i - 1;
// 根结点入队
parents.push(root);
while (!parents.empty()) {
TreeNode *cur = parents.front();
// 左子树不为空
if (cur->left) {
if (i != pre + 1)
return false;
parents.push(cur->left);
// 更新前一结点的位置
pre = i++;
} else {
i++;
}
// 右子树不为空(同理)
if (cur->right) {
if (i != pre + 1)
return false;
parents.push(cur->right);
pre = i++;
} else {
i++;
}
// 当前结点出队 继续遍历
parents.pop();
}
// 遍历完毕 所有结点连续
return true;
}