二叉树的层次遍历算法及其应用
目录
前言
本篇文章主要介绍二叉树的层次遍历算法模板以及二叉树层次遍历算法模板改写可以解决问题
1、求二叉树深度
2、求二叉树宽度
3、求指定某一层k的叶子节点数
4、自下而上,从右到左的层次遍历
-
层次遍历算法模板
//层次遍历
void LevelOrder(BiTree T){
queue<BiTree> Q;
Q.push(T);
BiTree p;
while(!Q.empty()){
p=Q.front();
Q.pop();
cout<<p->data<<' ';
if(p->lchild!=NULL){
Q.push(p->lchild);
}
if(p->rchild!=NULL){
Q.push(p->rchild);
}
}
}
-
求二叉树的深度
last指向当前层的最右节点,节点出队后与last指针比较,若两者相等则遍历完一层节点,层数+1,并让last指向下一层的最右节点
//求二叉树深度(借助层次遍历)
int height(BiTree T){
if(T!=NULL){
BiTree Qu[105];
BiTree p;
int front=-1;
int rear=-1;
int last=0;
int level=0;
Qu[++rear]=T;
while(front!=rear){
p=Qu[++front];
if(p->lchild!=NULL){
Qu[++rear]=p->lchild;
}
if(p->rchild!=NULL){
Qu[++rear]=p->rchild;
}
if(front==last){
level++;
last=rear;
}
}
return level;
}
return 0;
}
主函数
int main(){
system("chcp 65001");
BiTree T;
CreatBiTree(T);
cout<<"二叉树的深度为:"<<height(T)<<endl;
return 0;
}
运行结果如图所示:
-
求二叉树的宽度
last指向当前层的最右节点,节点出队后与last指针比较,若两者相等则遍历完一层节点,用width记录每层的节点数,max记录width的最大值即为二叉树的宽度
//求二叉树的宽度
int BtWidth(BiTree T){
if(T!=NULL){
BiTree Qu[105];
BiTree p;
int front=-1;
int rear=-1;
int last=0;
int max=0;
int width=0;
Qu[++rear]=T;
while(front!=rear){
p=Qu[++front];
width++;
if(p->lchild!=NULL){
Qu[++rear]=p->lchild;
}
if(p->rchild!=NULL){
Qu[++rear]=p->rchild;
}
if(front==last){
if(max<width){
max=width;
}
last=rear;
width=0;
}
}
return max;
}else{
return 0;
}
}
主函数
int main(){
system("chcp 65001");
BiTree T;
CreatBiTree(T);
cout<<"二叉树的宽度为:"<<BtWidth(T)<<endl;
return 0;
}
运行结果如下图所示:
-
求指定某一层k的叶子节点数
int LeafLevel(BiTree T,int k){
if(T!=NULL){
BiTree Qu[105];
BiTree p;
int front=0;
int rear=0;
int last=0;
int level;
int leaf=0;
Qu[++rear]=T;
last=rear;
level=1;
while(front!=rear){
p=Qu[++front];
if(level==k&&p->lchild==NULL&&p->rchild==NULL){
leaf++;
}
if(p->lchild!=NULL){
Qu[++rear]=p->lchild;
}
if(p->rchild!=NULL){
Qu[++rear]=p->rchild;
}
if(front==last){
level++;
last=rear;
}
if(level>k){
return leaf;
}
}
}else if(T==NULL||k<=1){
return 0;
}
}
主函数
int main(){
system("chcp 65001");
BiTree T;
CreatBiTree(T);
int k;
cin>>k;
cout<<"第"<<k<<"层的叶子结点数为"<<LeafLevel(T,k)<<endl;
return 0;
}
运行结果如下图所示:
-
自下而上、从右到左的层次遍历
在层次遍历算法的基础上节点出队后入栈,遍历结束后将栈中元素依次输出
//自下而上、从右到左的层次遍历算法
void LevelOrder1(BiTree T){
queue<BiTree> Q;
stack<BiTree> St;
Q.push(T);
BiTree p;
while(!Q.empty()){
p=Q.front();
Q.pop();
St.push(p);
if(p->lchild!=NULL){
Q.push(p->lchild);
}
if(p->rchild!=NULL){
Q.push(p->rchild);
}
}
while(!St.empty()){
p=St.top();
St.pop();
cout<<p->data<<' ';
}
}
主函数
int main(){
system("chcp 65001");//控制输出中文
BiTree T;
CreatBiTree(T);
cout<<"二叉树的层次遍历序列为:";
LevelOrder(T);
cout<<endl;
cout<<"二叉树自下而上从右到左的层次遍历序列为:";
LevelOrder1(T);
cout<<endl;
return 0;
}
运行结果如下图所示