二叉树层次遍历算法及其应用(求二叉树深度、宽度、自下而上、从右到左的层次遍历算法)

二叉树的层次遍历算法及其应用

目录

前言

层次遍历算法模板

 求二叉树的深度

求二叉树的宽度 

求指定某一层k的叶子节点数

 自下而上、从右到左的层次遍历


前言

本篇文章主要介绍二叉树的层次遍历算法模板以及二叉树层次遍历算法模板改写可以解决问题

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

 运行结果如下图所示

 


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值