文章目录

  • 题目描述
  • 算法思想
  • 实现代码

题目描述

 二叉树的带权路径长度WPL是二叉树中所有叶结点的带权路径长度之和。给定一棵二叉树,采用二叉链表存储,叶子结点的weight域为该结点的权值。请设计一个算法,求二叉树的带权路径长度。

算法思想

可以使用先序遍历或层次遍历解决问题。
<1>算法思想一:基于先序递归遍历。
用一个static变量记录WPL,把每个结点的深度作为递归函数的一个参数传递。

  • 若该结点是叶结点,则变量WPL加上该结点的深度与权值之和。
  • 若该结点是非叶结点,则左子树不为空时,对左子树调用递归算法,右子树不为空时,对右子树调用递归算法,深度参数均为本结点的深度参数加1。

<2>算法思想二:基于层序遍历。
使用队列进行层次遍历,并记录当前的层数。

  • 当遍历到叶结点时,累计WPL。
  • 当遍历到非叶结点时,把该结点的子树加入队列。
  • 当某结点为该层最后一个结点时,层数自增1。
  • 队列空时遍历结束,返回WPL。

实现代码

<1> 算法一的函数代码实现:

int WPL_PreOrder(BTree root, int deep){static int wpl = 0;if(root->lchild==NULL && root->rchild==NULL){ //若为叶结点,累积wpl += deep*root->weight;}if(root->lchild != NULL){  //若左子树不空,对左子树递归遍历WPL_PreOrder(root->lchild, deep+1);}if(root->rchild != NULL){  //若右子树不空,对右子树递归遍历WPL_PreOrder(root->rchild, deep+1);}return wpl;
}

<2>算法二的函数代码实现:

int WPL_Level(BTree root){queue<BNode *> treenode; //队列int wpl = 0;int deep = 0;  //初始化深度BNode *lastNode; //记录当前最后一个结点BNode *newlastNode; //记录下一层最后一个结点lastNode = root;  //初始化为根结点newlastNode = NULL;  //初始化为空treenode.push(root); //根结点入队while(!treenode.empty()){ //栈不空时循环BNode *top = treenode.front(); //取出队首元素treenode.pop();if(top->lchild==NULL && top->rchild==NULL){wpl += deep*top->weight;}//若为叶结点,累加if(top->lchild != NULL){ //若为非叶结点则把左孩子结点入队treenode.push(top->lchild);newlastNode = top->lchild; //设置下一层最后一个结点}if(top->rchild != NULL){  //右孩子结点入队treenode.push(top->rchild);newlastNode = top->rchild;}if(top == lastNode){  //若该结点为本层最后一个结点lastNode = newlastNode;  //更新deep+=1; //深度加1}}return wpl;
}

二叉树的带权路径长度WPL算法实现相关推荐

  1. wpl计算方法_C++二叉树计算带权路径长度(WPL)的算法

    题目 :二叉树的带权路径长度是二叉树中所有叶子结点的带权路径长度之和.给定二叉链表的存储的结点结构为 left | weight| right 存储的是叶子结点的非负权值.设计算法求二叉树的带权路径长 ...

  2. C++二叉树计算带权路径长度(WPL)的算法

    二叉树计算带权路径长度(WPL)的算法 更多内容请访问点击我的主页 题目 : 二叉树的带权路径长度是二叉树中所有叶子结点的带权路径长度之和.给定二叉链表的存储的结点结构为 left weight ri ...

  3. 算法学习笔记——数据结构:哈夫曼树、带权路径长度WPL、哈夫曼编码

    引入 合并果子问题如下: 有n堆果子,每次可以合并任意两堆果子,耗费体力值为[两堆果子数之和],最终在n-1次合并后,得到一堆果子. 给出合并的方案,使得耗费的体力值最小 例如有3堆果子,质量依次为1 ...

  4. 带权路径长度wpl值_哈夫曼树带权路径长度怎么计算

    哈夫曼树的带权路径长度是什么? 1.树的路径长度 树的路径长度是从树根到树中每一结点的路径长度之和.在结点数目相同的二叉树中,完全二叉树的路径长度最短. 2.树的带权路径长度(Weighted Pat ...

  5. 哈夫曼树的带权路径长度的算法

    计算方法: ①先对集合中的结点按照权值从小到大排. ②选两个权值最小的结点,将它们的权值相加构成一个新结点,原来的这两个最小的结点是新结点的左右子结点. ③在有序集合中将两个被加过的结点去掉,再把新的 ...

  6. 【哈夫曼树】带权路径长度WPL

    题目描述 哈夫曼树,第一行输入一个数n,表示叶结点的个数.需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和. 输入 输入有多组 ...

  7. wpl计算方法_已知权值集合为{5,7,2,3,6,1,4},计算带权路径长度WPL()。

    [简答题]电路图绘制 [单选题]已知二叉树树形如 ,其后序遍历序列为 e,a,c,b,d,g,f ,在二叉树中与 b 同层次的结点是( ). [单选题]在一个顺序存储的循环队列中,若队尾指针指向队尾元 ...

  8. JAVA实现二叉树带权路径长度和_哈夫曼树的构建与最小带权路径长度

    注意:哈夫曼树并不唯一,但带权路径长度一定是相同的. 二叉树:每个结点最多含有两个子树的树称为二叉树. 定理:对于具有n个叶子结点的哈夫曼树,共有2n-1个结点. 哈夫曼树介绍 1哈夫曼树的定义 哈夫 ...

  9. 哈夫曼树(带权路径长度+树的带权路径长度+哈夫曼树定义+构造哈夫曼树+哈夫曼树性质+哈夫曼编码+计算平均码长-这里指WPL)

    带权路径长度 树的带权路径长度WPL 哈夫曼树 哈夫曼树构造 哈夫曼树性质 哈夫曼编码 固定长度编码 可变长编码 前缀编码 固定长度编码.可变长编码.前缀编码.哈夫曼编码 思维倒图 试题

最新文章

  1. Flink并行度与Slot的关系
  2. Linux下的网络管理工具—OpenNMS
  3. java中的模板方法设计模式
  4. 【知识星球】从SVM对偶问题,到疲劳驾驶检测,到实用工业级别的模型压缩技巧...
  5. C++基础知识-Day8
  6. linux 使用 FIO 测试磁盘的iops
  7. c html转为datatable,C#中DataTable导出为HTML格式的方法
  8. OUTLOOK邮箱设置
  9. USACO全部月赛及GateWay数据
  10. matlab 传递函数求截止频率,高分求解RC滤波电路的传递函数和截止频率
  11. Wonderware-InTouch 服务器Windows Server 2012 R2系统安装intouch2017
  12. 刘晓燕核心词汇趣讲笔记-第十七课
  13. 【交通流理论拟合】-速度流量拟合
  14. 计算机控制实验比例环节,自动控制原理实验一典型环节的电路模拟与软件仿真...
  15. CSS实现选中图片效果
  16. 视频转GIF动图MATLAB源码
  17. 分贝、电平、增益、音高、音分、声能、声强、声压...
  18. TMS运输管理系统介绍
  19. 《算法笔记》Codeup练习 5.1小节 简单数学问题
  20. 公司法定代表人通常由谁担任?

热门文章

  1. 不管你学的是什么专业,你都应该多少懂些管理学的东西之【罗森塔尔效应】【虚假同感偏差】...
  2. 基于uCOS-II系统使用STM32和Esp8266对接Yeelink物联网平台的Demo
  3. htpc电脑方案_用xbmcbuntu系统一台电脑搞定HTPC+NAS 篇一:基础篇
  4. Git LFS笔记(文档、博客、issue摘录)
  5. Java实现蓝桥杯 算法提高 身份证号码升级
  6. actix-web -介绍
  7. Actix-Web构建一个简单的HTTP服务器
  8. Matter实战教程-Silicon Labs EFR32:学习教程目录
  9. TALKEE视频互动平台
  10. 中值定理、不等式与零点问题