[二叉树算法]关于层次遍历二叉树的一些算法总结

//递归遍历二叉树
void levelOrder(BTNode *T){
    if(T==null) return;
    int height=getHeight(T);
    for(int i=1;i<height;i++){
        _levelOrder(T,i);
    }
}
void _levelOrder(BTNode *T,int num){
    if(T==null||i==0) return;
    if(i==1){
        visit(T->data);
        return;
    }    
    _levelOrder(T->lchild,i-1);
    _levelOrder(T->rchild,i-1);
}
//使用栈
void levelOrder(BiTree T){
    Init(Queue Q);
    BTNode* p;
    EnQueue(Q,T);
    while(!isEmpty(Q)){
        DeQueue(Q,p);
        visit(p);
        if(T->lchild){
            EnQueue(Q,T->lchild);
        }
        if(T->rchild){
            EnQueue(Q,T->rchild);
        }
    }
}

关于层次遍历二叉树的相关应用


//层次遍历求二叉树高度  
int Height(BTNode *T){
    if(T==null) return 0;
    else{
        InitQueue(Q);
        int front=-1,rear=-1;
        int last=0,level=0;
        Q[++rear]=T;
        BTNode *p;
        while(front<rear){
            p=Q[++front];
            if(p->lchild!=null) Q[++rear]=p->lchild;
            if(p->rchild!=null) Q[++rear]=p->rchild;
            if(front==last){
                level++;
                last=rear;
            }
        }
        return level;
    }
}
//求指定层次叶子节点的个数 
int Count_leaf(BTNode *t,int k){
    if(t==null) return 0;
    BTNode *p;
    int front=-1,rear=-1;
    int last=0,level=0,num=0;
    InitQueue(Q);
    Q[++rear]=T;
    while(front<rear){
        p=Q[++front];
        if(p->lchild==null && p->rchild==null && level=k-1) num++;
        if(p->lchild!=null) Q[++rear]=p->lchild;
        if(p->rchild!=null) Q[++rear]=p->rchild;
        if(front==last){
            last=rear;
            level++;
        }
        if(level>k) return num;
    }
    return 0;
}
//求二叉树的宽度 
int count_bread(BTNode *t){
    if(t==null) return 0;
    BTNode *p;
    int front=-1,rear=-1;
    int last=0;
    InitQueue(Q);
    int tempnum=0,max=0;
    Q[++rear]=T;
    while(front<rear){
        p=Q[++front];
        tempnum++;
        if(p->lchild!=null) Q[++rear]=p->lchild;
        if(p->rchild!=null) Q[++rear]=p->rchild;
        if(front==last){
            last=rear;
            if(tempnum>max){
                max=tempnum;
            }
            tempnum=0;
        }
    }
    return max;
}
//判断一棵树是否为完全二叉树 4
bool IsComplete(BTNode *T){
    if(T==null) return true;
    BTNode *p=T;
    InitQueue(Q,p);
    while(!isEmpty(Q)){
        p=DeQueue(Q);
        if(p==null) break;
        EnQueue(Q,p->lchild);
        EnQueue(Q,p->rchild);
    }
    while(!isEmpty(Q)){
        p=DeQueue(&Q);
        if(p!=null)
            return false;
    }
    return true;
}

欢迎留言讨论

posted @ 2019-12-23 12:55  ZzUuOo666  阅读(759)  评论(0编辑  收藏  举报