2014年计算机联考真题——带权路径长度之和
来源:互联网 发布:云计算 中国 编辑:程序博客网 时间:2024/06/07 10:00
思路如下:
利用层次遍历的思路,记录每层的层数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; }
截图如下:
阅读全文
1 0
- 2014年计算机联考真题——带权路径长度之和
- 2010年计算机联考真题——一维数组循环左移
- 2011年计算机联考真题——寻找2个序列的中位数
- 2013年计算机联考真题——确定主元
- 2016年计算机联考真题——寻求最大子集和的差
- 求解最优二叉树所有叶子结点的带权路径长度之和
- 求其带权路径长度
- 求哈夫曼的带权路径长度
- 哈夫曼树 带权路径长度WPL
- 哈夫曼树的带权路径长度
- 带权路径长度 hnust数据结构
- 带权路径长度 层次遍历
- 2014年1月MBA联考英语真题答案及解析:阅读
- 396经济类联考数学真题分析
- CCF计算机职业认证—数位之和
- 解决关于哈夫曼编码计算带权路径长度问题
- 【数据结构】求节点的哈夫曼的带权路径长度
- 优先队列解哈夫曼编码问题之带权路径长度
- 完整安装vmware10和centOS6.4(64位)
- 对于查询调优,你需要的不止STATISTICS IO
- 星小环的AI读书会—深度学习系列01开篇
- C++智能指针详解
- Android弹出Window提示框(基于Android6.0)
- 2014年计算机联考真题——带权路径长度之和
- poj 1019
- java大数算法完成五则运算之类基础
- java 实现leetcode Two Sum II
- Eclipse插件springsource-tool-suite的下载和安装
- FFMPEG的AVFormatContext、AVStream、AVPacket、AVFrame时间戳分析
- 链表
- CentOS 6.5 升级内核到 3.10.28
- Spring-AOP @AspectJ切点函数之@annotation()