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

除最后一层无任何孩子外,每一层上的所有结点都有左右孩子的二叉树叫做满二叉树。

判断一棵二叉树是不是满二叉树,首先是递归的方法:

空树是满二叉树,非空的树当且仅当它的左右子树都是满二叉树的时候,它就是一棵满二叉树。

每个子树应当满足:① 同时存在左子树和右子树;② 左右子树高度相同。

/*每个节点都存在左右孩子并且左右子树深度相同时是满二叉树*/ 
int Height(Tree& t){
	if(t == NULL) return 0;
	return Height(t->left) > Height(t->right) ? Height(t->left) + 1 : Height(t->left) + 1;
} 

bool isFullTree(Tree& t){
    if(t == NULL) return true;
	return isFullTree(t->left) && isFullTree(t->right) && Height(t->left) == Height(t->right);
}

非递归的办法:

利用广度优先遍历,记录每层的宽度,判断每层的宽度是否符合 2 ^(n - 1)。

bool levelOrder(Tree& t) {
    if(t == NULL) return 0;
    queue<TreeNode*> q;
    int num = 1; //num控制每一层的结点个数,根结点只有一个节点
    q.push(t);
    while(!q.empty()){ 
        int width = q.size();
        for(int i = 0;i < width;i++){
        	TreeNode* s = q.front();
        	q.pop();
        	if(s->left) q.push(s->left);
        	if(s->right) q.push(s->right);
    	}
    	if(width < num) return false; //只要有一层出队个数小于num,那么就不是一棵满二叉树
    	else num *= 2;
	}
    return true;
}

总的代码如下:

#include<iostream>
#include<queue>
using namespace std;

typedef struct node{
	char val;
	struct node* left;
	struct node* right;
}TreeNode,*Tree;

//非递归 
/*由根向下进行广度优先遍历,判断每层是否为满*/ 
bool levelOrder(Tree& t) {
    if(t == NULL) return 0;
    queue<TreeNode*> q;
    int num = 1; //num控制每一层的结点个数,根结点只有一个节点
    q.push(t);
    while(!q.empty()){ 
        int width = q.size();
        for(int i = 0;i < width;i++){
        	TreeNode* s = q.front();
        	q.pop();
        	if(s->left) q.push(s->left);
        	if(s->right) q.push(s->right);
    	}
    	if(width < num) return false; //只要有一层出队个数小于num,那么就不是一棵满二叉树
    	else num *= 2;
	}
    return true;
}

//递归 
/*每个节点都存在左右孩子并且左右子树深度相同时是满二叉树*/ 
int Height(Tree& t){
	if(t == NULL) return 0;
	return Height(t->left) > Height(t->right) ? Height(t->left) + 1 : Height(t->left) + 1;
} 

bool isFullTree(Tree& t){
    if(t == NULL) return true;
	return isFullTree(t->left) && isFullTree(t->right) && Height(t->left) == Height(t->right);
}

void CreateTree(Tree& t){
	char x;
	cin>>x;
	if(x == '#') t = NULL; 
	else{
		t = new TreeNode; 
		t->val = x;  
		CreateTree(t->left); 
		CreateTree(t->right); 
	}
} 

int main(){
	Tree t;
	CreateTree(t);
	/*
	   a b d # # e # # c f # # #
	*/
	/*
	   a b d # # e # # c f # # g # #
	*/
	cout<<"isFullTree:"<<endl;
	cout<<isFullTree(t)<<endl; 
	cout<<"levelOrder:"<<endl;
	cout<<levelOrder(t); 
}

运行结果:

 

Logo

汇聚原天河团队并行计算工程师、中科院计算所专家以及头部AI名企HPC专家,助力解决“卡脖子”问题

更多推荐