判断一棵树是否是完全二叉树。

来源:互联网 发布:淘宝美工制作流程 编辑:程序博客网 时间:2024/05/19 08:41

提示:层序遍历变型题。
完全二叉树:根节点下除叶子节点外,每个结点的左右子树不能为空,叶子结点重左至右依次存在。
满二叉树:完全二叉树的特殊情况,每一层节点数为2^( n -1 )个。
验证过程,当存节点的队列不为空,则进入循环,遍历二叉树,当左右节点均不为空,则释放当前队头节点,依次存放左左节点,右节点;左为空,右不为空时,不满足条件,则退出并返回false;下来就剩左右均为空,左空右不为空两种情况。

#define _CRT_SECURE_NO_WARNINGS 10#include<iostream>#include<stdlib.h>#include<queue>using namespace std;struct TreeNode{    int _data;    TreeNode* _left;    TreeNode* _right;    TreeNode(int x = 0)        :_data(x)        , _right(NULL)        , _left(NULL)    {}};class Tree{public:    Tree()        :_root(NULL)    {}    Tree(const int* arr,size_t size,const int invalue)    {        size_t index = 0;        _CreateTree(_root,arr, size,index, invalue);    }    bool IsComplete()    {        if (_root == NULL)            return false;        queue<TreeNode*> q;        q.push(_root);        while (!q.empty())        {            TreeNode* top = q.front();            if (top->_left&&top->_right)            {                q.pop();                q.push(top->_left);                q.push(top->_right);            }            if (top->_left == NULL&&top->_right)                return false;            if ((top->_left&&top->_right == NULL) || (top->_left == NULL&&top->_right==NULL))            {                q.pop();                while (!q.empty())                {                    top = q.front();                    if (top->_left == NULL&&top->_right == NULL)                        q.pop();                    else                        return false;                }                return true;            }        }        return true;    }protected:    void _CreateTree(TreeNode*& root,const int arr[],size_t size,size_t& index,const int value)    {        if (index < size&&arr[index] != value)        {            root = new TreeNode(arr[index]);            _CreateTree(root->_left, arr, size, ++index, value);            _CreateTree(root->_right, arr, size, ++index, value);        }    }private:    TreeNode* _root;};int main(){    int arr[10] = { 1, 2, 3, '#', '#', 4, '#', '#', 5, 6 };    Tree tree(arr, 10, '#');    cout << tree.IsComplete() << endl;    system("pause");    return 0;}
原创粉丝点击