满二叉树的定义:除最后一层是叶子结点,其他各层都有两个孩子结点。
将定义形象化为编程条件:
(1)只有最后一层是叶子结点:
那么这个叶子结点一定是这一层的第一个,并且这个结点以后的结点都是叶子结点,下面两种情况不是满二叉树。
第一图,第一个叶子结点不是这一层第一个结点,第二图第一个叶子结点的后续结点不全是叶子结点。
(2)其他各层都有两个孩子
除最后一层,其他层如果出现只有一个孩子的情况,就不是满二叉树,例如有左孩子无右孩子或有右孩子无左孩子。
一、二叉树结构体表示如下:
struct TreeNode{
TreeNode(int value):left(NULL),right(NULL),val(value){ }
TreeNode *left;
TreeNode *right;
int val;
};二、用先序建立二叉树(递归或非递归都可以)
三、主程序代码:
采用BFS进行遍历。
bool JudgeFullBinaryTree(TreeNode *node){
if(node == NULL) return true;
typedef std::pair<TreeNode*,int> PTI; //pair的第二个模版参数用于记录层数
queue<PTI> q;
q.push(PTI(node, 1));
PTI curnode ;
int prevdeepth = 0;
//用flag标识第一次出现叶子结点,其后的所有结点应该是叶子结点
int flag = false;
while(!q.empty()){
curnode = q.front();
q.pop();
if((curnode.first->left == NULL && curnode.first->right != NULL) //只有右孩子
||
curnode.first->left != NULL && curnode.first->right == NULL) //只有左孩子
return false;
if(flag){
if(curnode.first->left == NULL && curnode.fisrt->right == NULL)
;
else
return false; //叶子结点后续结点有非叶子结点
}else{
if(curnode.first->left == NULL && curnode.first->right == NULL){
if(curnode.second > prevdeepth){ //每一层的第一个结点一定大于前一结点的层数
flag = true;
}else{ //如果层数不大于前一结点层数,那一定是同一层
return false;
}
}else{
q.push(PTI(curnode.first->left, curnode.second + 1));
q.push(PTI(curnode.first->right, curnode.second + 1));
}
}
prevdeepth = curnode.second;
}
return true;
}四、主调用接口:
int main(void)
{
TreeNode *root = NULL;
PreoderBuildTree(root);
if(JudgeFullBinaryTree(root))
std::cout << "True" << std::endl;
else
std::cout << "False" << std::endl;
}

4849

被折叠的 条评论
为什么被折叠?



