戴璞微的博客

简单点!做事的动机简单点

2014年计算机联考真题——带权路径长度之和

这里写图片描述


思路如下:
利用层次遍历的思路,记录每层的层数level,对于该层的每个叶节点的带权路径长度 = data*(level-1)
算法如下:

        //求叶子节点带权路径长度之和
        int WPL(BinaryTree* T){
            BinaryTree* queue[100];         //构造容量足够大的队列
            BinaryTree* cur = T;            //指向根节点指针
            int front = -1,rear = -1;       //队头与队尾指针
            //last指向每层的最后一个结点,level代表层数 
            int last = 0,level = 0;
            int sum = 0;                //带权路径长度之和       
            queue[++rear] = cur;        //根节点入队 
            level++;
            //队列不为空一直进行循环  
            while(front < rear){
                cur = queue[++front];   //根结点出队
                if(cur->lchild == NULL && cur->rchild == NULL){
                    int weight = cur->data-'0';
                    sum += (level-1)*weight;
                }
                //左孩子非空入队
                if(cur->lchild){            
                    queue[++rear] = cur->lchild;
                }
                //右孩子非空入队
                if(cur->rchild){            
                    queue[++rear] = cur->rchild;
                }
                //队头指针是该层最后一个结点时 
                if(front == last){          
                    level++;                //层数加一 
                    //最后一个结点指针下移到下一层的最后一个结点 
                    last = rear;            
                }
            }
            return sum;
        } 

完整代码如下:

#include <iostream>
using namespace std;

class BinaryTree{
    private:
        char data;
        BinaryTree* lchild;
        BinaryTree* rchild;
    public: 
        //二叉树的初始化函数 
        BinaryTree* Create_BinaryTree(){
            BinaryTree* T = new BinaryTree;
            char ch;
            cin>>ch;
            if(ch == '#'){                                                  //“#”是结束标志 
                T = NULL;
            }else{
                T->data = ch;                                               //对当前结点初始化 
                T->lchild = Create_BinaryTree();                            //递归构造左子树 
                T->rchild = Create_BinaryTree();                            //递归构造右子树 
            }
            return T;
        }


        //求叶子节点带权路径长度之和
        int WPL(BinaryTree* T){
            BinaryTree* queue[100];         //构造容量足够大的队列
            BinaryTree* cur = T;            //指向根节点指针
            int front = -1,rear = -1;       //队头与队尾指针
            //last指向每层的最后一个结点,level代表层数 
            int last = 0,level = 0;
            int sum = 0;                //带权路径长度之和       
            queue[++rear] = cur;        //根节点入队 
            level++;
            //队列不为空一直进行循环  
            while(front < rear){
                cur = queue[++front];   //根结点出队
                if(cur->lchild == NULL && cur->rchild == NULL){
                    int weight = cur->data-'0';
                    sum += (level-1)*weight;
                }
                //左孩子非空入队
                if(cur->lchild){            
                    queue[++rear] = cur->lchild;
                }
                //右孩子非空入队
                if(cur->rchild){            
                    queue[++rear] = cur->rchild;
                }
                //队头指针是该层最后一个结点时 
                if(front == last){          
                    level++;                //层数加一 
                    //最后一个结点指针下移到下一层的最后一个结点 
                    last = rear;            
                }
            }
            return sum;
        } 
};

int main()
{
    cout<<"请初始化二叉树:"<<endl;
    BinaryTree* T;
    T = T->Create_BinaryTree();

    cout<<"叶子节点的带权路径之和为:"<<endl;
    int wpl = T->WPL(T);
    cout<<wpl<<endl; 

    return 0;
 } 

截图如下:
这里写图片描述

阅读更多
版权声明:本文为博主原创文章,若需转载,请注明http://blog.csdn.net/qq_30091945 https://blog.csdn.net/qq_30091945/article/details/77619867
个人分类: 数据结构
所属专栏: 数据结构与算法
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭