完全二叉树的判断

要判断是不是完全二叉树,首先要知道什么是完全二叉树?
完全二叉树:如果一棵具有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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值