【数据结构·考研】判断满二叉树
判断一棵二叉树是不是满二叉树除最后一层无任何孩子外,每一层上的所有结点都有左右孩子的二叉树叫做满二叉树。判断一棵二叉树是不是满二叉树,首先是递归的方法:空树是满二叉树,非空的树当且仅当它的左右子树都是满二叉树的时候,它就是一棵满二叉树。每个子树应当满足:① 同时存在左子树和右子树;② 左右子树高度相同。/*每个节点都存在左右孩子并且左右子树深度相同时是满二叉树*/int Height(Tree&a
·
判断一棵二叉树是不是满二叉树
除最后一层无任何孩子外,每一层上的所有结点都有左右孩子的二叉树叫做满二叉树。
判断一棵二叉树是不是满二叉树,首先是递归的方法:
空树是满二叉树,非空的树当且仅当它的左右子树都是满二叉树的时候,它就是一棵满二叉树。
每个子树应当满足:① 同时存在左子树和右子树;② 左右子树高度相同。
/*每个节点都存在左右孩子并且左右子树深度相同时是满二叉树*/
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);
}
运行结果:
更多推荐
已为社区贡献2条内容
所有评论(0)