判断二叉树是否为完全二叉树

来源:互联网 发布:mac sdk 配环境变量 编辑:程序博客网 时间:2024/05/01 05:19

原理

从二叉树的根层序遍历直到遍历到第一个NULL,然后继续遍历,如果还有结点则该树不是完全二叉树。

实现代码

1、第一种
bool _IsEntireTree(BinaryTreeNode<T>* pRoot){if (pRoot == NULL)return true;queue<BinaryTreeNode<T>* > q;q.push(pRoot);//遍历链表直到NULL结点,该循环退出,则已经标记了一个NULLwhile (q.front()){BinaryTreeNode<T>* pFront = q.front();q.push(pFront->_pLeft);q.push(pFront->_pRight);q.pop();}while (!q.empty())//队列不为空{if (q.front() != NULL)//队列头节点还不为空,则不是完全二叉树return false;q.pop();}return true;}
2、第二种
bool _IsEntireTree(BinaryTreeNode<T>* pRoot){if (pRoot == NULL)return true;if (pRoot->_pLeft == NULL && pRoot->_pRight == NULL)return true;queue<BinaryTreeNode<T>* > q;q.push(pRoot);bool flag = false;//用来标记队列中的NULLwhile (!q.empty()){BinaryTreeNode<T>* pTemp = q.front();if (pTemp != NULL){if (flag)//队列不为空且队列中第二次出现NULL,则该二叉树不是完全二叉树return false;q.push(pTemp->_pLeft);q.push(pTemp->_pRight);}elseflag = true;//当队列中出现一次NULL标记一次q.pop();}return true;}