要判断是不是完全二叉树,首先要知道什么是完全二叉树? 完全二叉树:如果一棵具有N个结点的二叉树的结构与满二叉树的前N个节点的结构相同,称为完全二叉树。 所以就分了以下几种情况: 该节点有左右子树,继续判断 该节点只有左子树,判断他的下一个节点还有没有子树,如果有就不是 该节点只有右子树,不是 该节点左右子树都没有,判断他的下一个节点还有没有子树,如果有就不是
所以,以下就是代码:
using namespace std; template <class T> struct BinaryTreeNode//定义二叉树的节点 { BinaryTreeNode(const T& value) :_value(value) ,_pLeft(NULL) ,_pRight(NULL) {} T _value; BinaryTreeNode<T>* _pLeft; BinaryTreeNode<T>* _pRight; }; template<class T> class BinaryTree//定义二叉树 { typedef BinaryTreeNode<T> Node; public: BinaryTree() :_pRoot(NULL) {} private: Node* _pRoot;//根节点 }; bool IsCompleteBinaryTree() { if(_pRoot == NULL) return true; queue<Node*> q; q.push(_pRoot); bool flag = false; while(!q.empty()) { Node* pCur = q.front(); if(flag == true) { if(pCur->_pLeft || pCur->_pRight)//如果该结点的左或右孩子存在 return false; } if(pCur->_pLeft && pCur->_pRight)//左右孩子都存在 { q.push(pCur->_pLeft); q.push(pCur->_pRight); } else if(pCur->_pLeft)//只有左孩子,判断下一个节点是否存在左右孩子 { q.push(pCur->_pLeft); flag = true; } else if(pCur->_pRight)//只有右孩子,不能构成完全二叉树 { return false; } else//左右孩子都不存在,需要判断下一个个节点是否存在左右孩子 flag = true; q.pop(); } return true; }