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

原创 2017年08月27日 13:10:40

这里写图片描述


思路如下:
利用层次遍历的思路,记录每层的层数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

相关文章推荐

求解最优二叉树所有叶子结点的带权路径长度之和

根据网上的相关资料,通过构造哈夫曼树求解最优二叉树所有叶子结点的带权路径长度之和   # include #include #define maxsize 30; /*     霍夫曼树求解最佳二叉...
  • wjhsg
  • wjhsg
  • 2015年07月10日 11:19
  • 822

2010年计算机联考真题——一维数组循环左移

前记从七月份决定开始考研,中间由于听报告,回家复习数学和政治但无论一些时间。自己准备报考山东大学计算机技术的专硕,幸好是数学是考数学二,专业课一直有一门数据结构,这位我的复习节省了很多时间,不想数学一...

2011年计算机联考真题——寻找2个序列的中位数

思路: 设定两个升序序列分别为A与B,中位数分别为a和b。 1.如a=b,则即为所求,算法结束。 2.a#include using namespace std;int Median(int*...

2014年1月MBA联考英语真题答案及解析:阅读

mba中国网讯:Section II Reading Comprehension     Part A     Text 1     21、【答案】B A special tour   ...

解决关于哈夫曼编码计算带权路径长度问题

这是在做一道编程提示遇到的,学习了一位博主的编码,其中有些问题未能理解,分析解决掉。 首先什么是哈夫曼树: 哈夫曼树,又称最优二叉树,是一类带权路径长度最短的树。 也就是根节点到节点的中的长度最...

带权路径长度 hnust数据结构

问题 U: 带权路径长度 时间限制: 2 Sec  内存限制: 128 MB 提交: 268  解决: 48 [提交][状态][讨论版] 题目描述 给定n个权值作为n个叶子结点,构造...

优先队列解哈夫曼编码问题之带权路径长度

1.什么是优先队列? 先说个生活中的例子 想想医院,重症急诊患者肯定不能像普通患者那样依次排队就诊,他们就可以插队了 他比较迟进队列,但他优先级高,所以就相对较早出队列去就诊了 优先队列一般用...

哈夫曼树的基本操作,(树的建立,带权路径长度,哈夫曼编码)

哈夫曼树中的名词意思:(ps:本想画个图的不知这上面怎么弄,就没弄了) 树的权值:每个树节点所在的那个数字。 路径:两个节点之间所经过的分支。 路径长度: 某一路径上的分支条数。 节点带权路径长度:...
  • lfb637
  • lfb637
  • 2017年09月27日 16:11
  • 199

哈夫曼树结构和带权路径长度计算

什么是哈夫曼树呢? 哈夫曼树是一种带权路径长度最短的二叉树,也称为最优二叉树。下面用一幅图来说明。 它们的带权路径长度分别为: 图a: WPL=5*2...
  • xueba8
  • xueba8
  • 2017年11月08日 13:55
  • 34

构造哈夫曼树并求带权路径长度(c语言/CodeBlocks实现)

构造哈夫曼树并求带权路径长度(c语言/CodeBlocks实现)#include #include #include #include #include using namespace st...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:2014年计算机联考真题——带权路径长度之和
举报原因:
原因补充:

(最多只允许输入30个字)