(一)判断完全二叉树
特点一:
只允许最后一层有空缺结点且空缺在右边,即叶子结点只能在层次最大的两层上出现;
特点二:
对任一结点,如果其右子树的深度为j,则其左子树的深度必为j或j+1 即度为1的点只有1个或0个
解题思路:
首先一棵空树是完全二叉树
利用队列 先将根节点入队 只要当前节点不为NULL 先从队列front()得到一个节点 并将吹对节点的左右孩子入队 如果存在只有一个孩子的情况 用NULL来代替那个孩子
如果当前节点为空了 则判断队列是否weiNULL
如果队列也null了 那么此棵树就是完全二叉树
队还不为NULL那么就直接front出队 如果当前出队的节点是NULL节点 则证明不是完全二叉树
bool Is_Comp_BinaryTree(BtNode *ptr)
{
if(ptr == NULL) return true;
queue<BtNode*> qu;
qu.push(ptr);
while(ptr != NULL)//只要节点不为NULL 就进行出队 并且入出队节点的左右孩子
{
ptr = qu.front();qu.pop();
if(ptr != NULL)
{
qu.push(ptr->leftchild);
qu.push(ptr->rightchild);
}
}
while(!qu.empty())//节点NULL 但是队列不空时
{
ptr=qu.front();qu.pop();
if(ptr == NULL)//出队节点为NULL 则证明不是一个完全二叉树 入队时 先入左 在入右
{
return false;
}
}
return true;
}
(二)判断满二叉树
空树不是一棵满二叉树
每个节点都存在左右孩子 并且左右子树深度要相同
递归代码
//递归
bool Is_Full_BinaryTree1(BtNode* ptr)
{
return (ptr == NULL) ||
(ptr != NULL && Is_Full_BinaryTree1(ptr->leftchild) &&
Is_Full_BinaryTree1(ptr->rightchild)) &&
Depth_BinTree(ptr->leftchild) == Depth_BinTree(ptr->rightchild);
}
非递归思路
计算出树的深度以及树的节点个数num
然后根据深度求出如果为满二叉树应有的节点个数sum
如果num == sum那么为满二叉树
bool Is_Full_BinaryTree2(BtNode* ptr)
{
if(ptr == NULL )
return false;
//求出数的深度
int k = Depth2(ptr);
//求出树的节点个数
int num = Size_BinTree(ptr);
int sum = 0;
int count = 1;
//遍历求出次数如果为满二叉树时的总节点数
//满二叉树下一层节点个数为上一层的2倍
for(int i = 0 ; i <= k ;++i)
{
sum += count;
count = count*2;
}
if(num == sum)
return true;
else
return false;
}
非递归用队列实现
将树的节点都入队
然后按照满二叉树每一层的节点个数控制节点出队 如果每一层都满足节点数控制 那么为满二叉树
只要存在一层不满足出队数量 就不是满二叉树
bool Is_Full_BinaryTree3( BtNode *ptr)
{
if(ptr == NULL)
return false;
int num = 1; //控制每一层的节点个数 从根节点开始 只有一个节点
queue<BtNode*> qu;
qu.push(ptr);
while(!qu.empty())
{
int i ;
for( i = 0 ; i < num && !qu.empty();++i)
{
while(!qu.empty())
{
ptr = qu.front();qu.pop();
if( ptr->leftchild != NULL)
{
qu.push(ptr->leftchild);
}
if(ptr->rightchild != NULL)
{
qu.push(ptr->rightchild);
}
}
}
//只要有一层出队个数小于num那么 就不是一棵满二叉树
if(i < num )
{
return false;
}
else
{
num *= 2;
}
}
return true ;
}