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 举报

相关文章推荐

哈夫曼树 带权路径长度WPL

1002. Huffman coding                 Time Limit: 1sec    Memory Limit:256MB Desc...

带权路径长度 层次遍历

思路:层次遍历 带权路径长度:结点具有权值,从该结点到根之间的路径长度乘以结点的权值,就是该结点的带权路径长度。 叶子结点的带权路径长度:从叶结点到根之间的路径长度(所在层数-1)乘以叶结点的...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

概念堆是一个用数组表示的完全二叉树,并满足以下两个特性: 1)父节点的键值总是大于或等于(小于等于)其子树上的任意结点 2)每个结点的左子树和右子树都是个堆。 如果父节点的键值总是大于等于任何一...

local function definitions are illegal解决办法

原文出处http://wenku.baidu.com/view/1f3eb740c850ad02de8041ac.html 编译错误:local function definitions are i...

数组实现根据二叉树的先序遍历和中序遍历构造二叉树

根据二叉树的先序遍历和中序遍历构造二叉树是非常经典的一道算法题目,但是在网上找到的资料绝大多数都是使用链接方式构造二叉树,感觉这样比较繁琐,因此自己写了一个数组实现的程序,当然,程序不算很完善,还望朋...

平衡二叉树

由于平衡二叉树的前提是二叉搜索树,故关于二叉搜索树的内容请移步如下网址:http://blog.csdn.net/qq_30091945/article/details/77720865概念平衡因子:...

根据二叉树的前序遍历和中序遍历,重构出二叉树

题目:这道题目是一道面试题,先序遍历和中序遍历以数组的形式给出,要求我们根据这两个条件重构出二叉树。 下图是一棵二叉树 // 6 // / \...

并查集

并查集并查集是一种树形结构,又叫“不相交集合”,保持了一组不相交的动态集合,每个集合通过一个代表来识别,代表即集合中的某个成员,通常选择根做这个代表。初始化用数组来建立一个并查集,数组下标代表元素,下...

二叉树的构建及其遍历算法

概要二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的。二叉树有先、中、后,层次四种遍历方式,因为树的本身就是用递归定义的,因此采用递归的方法实现三种遍历,不仅代码简洁且容...

二叉搜索树

关于二叉树的基本操作请转到我的另一片博客: http://blog.csdn.net/qq_30091945/article/details/77531651概念Binary Search Tree...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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