您的位置:首页 > 编程语言 > C语言/C++

【C++】满二叉树与完全二叉树的区别及判断

2015-11-29 14:12 656 查看


[align=left]满二叉树与完全二叉树的区别:[/align]
(1)完全二叉树,除最后一层可能不满以外,其他各层都达到该层节点的最大数;最后一层如果不满,该层所有
节点都全部靠左排。
[align=left](2)满二叉树,所有层的节点数都达到最大.[/align]

[align=left]满二叉树与完全二叉树的判断:[/align]
[align=left](1)满二叉树:因为满二叉树的节点个数size与树的深度h的关系为:2^h - 1 = size,所以只需求出所要判断的树的[/align]
[align=left] 的节点个数与深度,验证是否满足该关系式即可。[/align]
[align=left](2)完全二叉树:利用层序遍历(空节点也入队列),若遇到NULL节点后,还有非空节点,就不是完全二叉树[/align]
#include<iostream>
#include<queue>
using namespace std;
struct BinaryTreeNode
{
char _data;
BinaryTreeNode*_left;
BinaryTreeNode*_right;
BinaryTreeNode(const char &data)
:_data(data)
, _left(NULL)
, _right(NULL)
{}
};

class BinaryTree
{
public:
BinaryTree(const char *str)
{
_CreatBinaryTree(_root, str);//递归创建二叉树
}
int Size() //求二叉树的节点个数
{
return _Size(_root);
}
int Depth()//求二叉树的深度
{
return _Depth(_root);
}

void FullResult()//二叉树判满的输出结果
{
if (FullBinaryTree())
{
cout << "该二叉树是满二叉树" << endl;
}
else
{
cout << "该二叉树不是满二叉树" << endl;
}
}

void CompletelyResult()//二叉树是否为完全二叉树的输出结果
{
if (CompletelyBinaryTree())
{
cout << "该二叉树是完全二叉树" << endl;
}
else
{
cout << "该二叉树不是完全二叉树" << endl;
}
}
protected:
//递归创建二叉树
void _CreatBinaryTree(BinaryTreeNode*&root, const char *&str)
{
if (*str != '#'&&*str != '\0')
{
root = new BinaryTreeNode(*str);
_CreatBinaryTree(root->_left, ++str);
if (*str != '\0')
{
_CreatBinaryTree(root->_right, ++str);
}
}
}
int _Size(BinaryTreeNode*root)
{
if (root == NULL)
{
return 0;
}
else
{
return 1 + _Size(root->_left) + _Size(root->_right);
}
}
int _Depth(BinaryTreeNode*root)
{
if (root == NULL)
{
return 0;
}
else
{
return 1 + (_Depth(root->_left) > _Depth(root->_right) ? _Depth(root->_left):_Depth(root->_right));
}
}
bool FullBinaryTree()//判断该二叉树是否是满二叉树
{
if (pow(2, Depth()) - 1 == Size())
{
return true;
}
return false;
}
bool CompletelyBinaryTree()//判断该二叉树是否是完全二叉树
{
int flag = false;
queue<BinaryTreeNode *>q;
if (_root)
{
q.push(_root);
}
while (!q.empty())
{
BinaryTreeNode* front = q.front();
q.pop();
if (front)
{
if (flag)
{
return false;
}
q.push(front->_left);
q.push(front->_right);
}
else
{
flag = true;
}
}
return true;
}
private:
BinaryTreeNode*_root;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: