二叉树--判断一棵树是否是完全二叉树
完全二叉树: 前n-1层都是满的,第n层如有空缺,则是缺在右边,即第n层的最右边的节点,它的左边是满的,右边是空的。
如何判断一个树是否为完全二叉树?
思路一:将所有的结点全部押入队列中,空也压入,每次判断队列的头如果队列头为空了则跳出循环,如果此后队列中还有元素则不是完全二叉树。
bool IsCompleteTree(BinaryTreeNode *pRoot)
{
if(pRoot == NULL)
return false;
queue<BinaryTreeNode*> q;
q.push(pRoot);
BinaryTreeNode* pCur = q.front();
while(pCur != NULL)
{
q.pop();
q.push(pCur -> left);
q.push(pCur -> right);
pCur = q.front();
}
q.pop();//把空pop出来
//因为以经有一个空了,所以只要头不为空就不是完全二叉树
while(! q.empty())
{
if(q.front() != NULL)
return false;
q.pop();
}
return true;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
思路二:按照层序遍历二叉树,找到第一个只有非满结点(这个节点只有两种情况,孩子为空或者只有左没有右),如果之后的节点还有非满结点,则不是。
bool IsCompleteTree(BinaryTreeNode* pRoot)
{
if(pRoot == NULL)
return false;
queue<BinaryTreeNode*>q;
q.push(pRoot);
//这里给一个flag是标记是否出现过满结点
bool flag = false;
while(!q.empty())
{
BinaryTreeNode* pCur = q.front();
q.pop();
//如果已经出现过满结点,则后面再出现有孩子的结点则一定不是完全二叉树。
if(flag)
{
if(pCur ->left != NULL || pCur -> right != NULL)
return false;
}
else{
if(pCur -> left != NULL && pCur -> right != NULL)
{
q.push(pCur -> left);
q.push(pCur -> right);
}
else if(pCur -> left == NULL && pCur -> right != NULL)
return false;
else if(pCur -> left != NULL && pCur -> right == NULL)
{
q.push(pCur -> left);
flag = true;
}
else
flag = true;
}
}
return true;
}