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

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

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

(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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值