判断一棵树是不是满二叉树

来源:互联网 发布:c专家编程读书笔记 编辑:程序博客网 时间:2024/05/17 02:29

满二叉树的定义:除最后一层是叶子结点,其他各层都有两个孩子结点。

将定义形象化为编程条件:

(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);elsereturn 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;elsestd::cout << "False" << std::endl;}


0 0
原创粉丝点击