满二叉树:如下图除叶子节点外每个结点都达到饱和(左右孩子都存在)
完全二叉树:与满二叉树的前N个结点的结构相同的二叉树。
当找到第一个不饱和结点时,有如下情况:
1、该不饱和结点的左右孩子都存在,此时肯定是完全二叉树
2、该不饱和结点只有左孩子,也是完全二叉树
3、该不饱和结点只有右孩子,不是完全二叉树
4、该不饱和结点无孩子
bool IsCompleteTree()
{
if (_root == NULL)
return false;
//不饱和结点
bool OnlyLeft = false;
queue<Node<T>*> q;
Node<T>* node = _root;
q.push(_root);
while (!q.empty())
{
node = q.front();
//找到第一个不饱和结点,只有左孩子
if (OnlyLeft)
{
//该结点如果有孩子,就不是完全二叉树
if (node->_left || node->_right)
return false;
}
//说明都是饱和结点
else
{
//只有左孩子,是完全二叉树
if (node->_left != NULL&&node->_right == NULL)
{
q.push(node->_left);
OnlyLeft = true;
}
//只有右孩子,不是完全二叉树
else if (node->_left == NULL&&node->_right != NULL)
return false;
//左右孩子都存在,看后续的结点
else if (node->_left != NULL&&node->_right != NULL)
{
q.push(node->_left);
q.push(node->_right);
}
//无左右孩子,为完全二叉树
else
return true;
}
q.pop();
}
return true;
}