欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

叶子结点带权路径长度和(先序遍历法和层序遍历法)

程序员文章站 2024-02-26 11:10:28
...

先序遍历

//deep初值为0
int leafNodeLength(Tree r,deep)
{
    static int wpl=0;
    if(r->lchild==NULL&&r->rchild==NULL)
        wpl+=deep*r->weight;
    if(r->lchild)
        leafNodeLength(r->lchild,deep+1);
    if(r->rchild)
        leafNodeLength(r->rchild,deep+1);
    return wpl;
}

层序遍历法

int leafNodeLength(Tree r)
{
    Tree p=r;
    queue Q;
    Enqueue(Q,p);
    int wpl=0;//叶子结点带权路径长度和
    int lastVisit=1;//该层最右一个结点的编号
    int nowVisit=0,number=1;//nowVisit:现在刚弹出队列的结点编号,number现在入队的结点编号
    int deep=0;
    while(!empty(Q)){
        Dequeue(Q,p);
        nowVisit++;
        if(p->lchild==NULL&&p->rchild==NULL)
            wpl+=deep*p->weight;
        if(p->lchild){
            Enqueue(p->lchild);
            number++;
        }
        if(p->rchild){
            Enqueue(p->rchild);  
            number++;
        }
        if(lastVisit==nowVisit)
            lastVisit=number;
    }
    return wpl;
}