算法思想: 遇到第一个没有左儿子或者右儿子的节点,设置标志位,如 果之后再遇到有左右儿子的节点,那么这不是一颗完全二叉树
//二叉树结点定义
typedef struct Node
{
int data;
struct Node* left;
struct Node* right;
}Node;
//实现广度遍历需要队列
Queue<Node*> queue;
//第n层最右节点标志
bool leftMost = false;
bool ProcessChild(Node* child)
{
if (child)
{
if (!leftMost)
{
queue.push(child);
}
else
{
return false;
}
}
else
{
leftMost = true;
}
return true;
}
bool IsCompleteBinaryTree(Node* root)
{
//空树也是完全二叉树
if (!root)
return true;
//首先根节点入队列
queue.push(root);
while(!queue.empty())
{
Node* node = queue.pop();
//处理左节点
if (!ProcessChild(node->left))
return false;
//处理右节点
if (!ProcessChild(node->right))
return false;
}
//广度优先遍历完毕,此乃完全二叉树
return true;
}
网友评论