1 满二叉树
除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。
2 分析
我们知道满二叉树是三角形的比如如下,最后一层任何一个节点的高度都是数的高度。
1
2 3
4 5 6 7
但是如下二叉树就不是满二叉树
1
2 3
4 5
我们知道满二叉树节点总数是 (2^k) -1个,那么我们只需要求出高度就知道所有数的所有节点总数,然后我们再通过按层打印看下所有节点总数是不是满足满二叉树节点总数是 (2^k) -1的特点。
3 代码实现
#include <iostream>
#include <queue>
using namespace std;
typedef struct Tree
{
int value;
struct Tree* left;
struct Tree* right;
Tree(int value):value(value), left(NULL), right(NULL){}
} Tree;
/**
* 按层非递归打印树节点,并且返回这个树节点的个数
*/
int printTree(Tree *node)
{
if (node == NULL)
return -1;
queue<Tree *> queue;
int count = 0;
queue.push(node);
while (queue.size())
{
Tree* pNode = queue.front();
++count;
//这里要记得需要pop操作,不然会死循环
queue.pop();
std::cout << pNode->value << "\t";
if (pNode->left != NULL)
queue.push(pNode->left);
if (pNode->right != NULL)
queue.push(pNode->right);
}
std::cout << std::endl;
return count;
}
/**
* 判断一棵树是不是满二叉树
*/
bool isFullTree(Tree *node)
{
if (node == NULL)
return false;
//先求满二叉树的高度,我们假设树是满二叉树,根据规律,最左边的节点高度就是满二叉树的高度
int high = 0;
Tree* p = node;
while (p)
{
++high;
p = p -> left;
}
int count = printTree(node);
if (((1 << high) - 1) == count)
return true;
else
return false;
}
int main()
{
Tree node1(1);
Tree node2(2);
Tree node3(3);
Tree node4(4);
Tree node5(5);
Tree node6(6);
Tree node7(7);
node1.left = &node2;
node1.right = &node3;
node2.left = &node4;
node2.right = &node5;
node3.left = &node6;
node3.right = &node7;
int count = printTree(&node1);
std::cout << "count is " << count << std::endl;
std::string res = "";
res = (isFullTree(&node1) == 1) ? "true" : "false";
std::cout << "Tree isFullTree is " << res << std::endl;
return 0;
}
4 运行结果
1 2 3 4 5 6 7
count is 7
1 2 3 4 5 6 7
Tree isFullTree is true
一开始我位运行搞错了,a<<b,是代表a左移动b位,而不是b左移a位。