🥳每日一练-计算二叉树的WPL-JS简易版

今天分享的内容是一道 2014 年的考研算法题,问题不难,考察的是二叉树的遍历。

题目:二叉树的带权路径长度 WPL 是二叉树中所有叶节点的带权路径长度之和,给一个二叉树 T,采用二叉链表存储,求 T 的 WPL

带权路径长度就是叶子的权重乘以叶子的路径长度。假设从 root 到叶子的路径长度是 4,叶子的权重是 5,那么叶子的带权路径长度就是 20

WPL 即求所有的叶子的带权路径长度

准备数据

javascript 复制代码
const data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

class Node {
	constructor(value, weight = value) {
		this.value = value;
		this.weight = weight;
		this.left = null;
		this.right = null;
	}
}

const generateWeightTree = (data, index) => {
	if (!data[index]) return null;
	const temp = new Node(data[index]);
	temp.left = generateWeightTree(data, index * 2);
	temp.right = generateWeightTree(data, index * 2 + 1);
	return temp;
};

const tree = generateWeightTree(data, 1);

上面代码准备了一个二叉树,为了方便,将每个二叉树的叶子的权重设成了和叶子值相同

计算二叉树的 WPL

javascript 复制代码
const getWeight = (tree, deep = 0) => {
  if (!tree) return 0;

  if (!tree.left && !tree.right) return deep * tree.weight;
  const lwpl = getWeight(tree.left, deep + 1);
  const rwpl = getWeight(tree.right, deep + 1);
  
  return lwpl + rwpl;
};

上面代码采用前序遍历的过层,计算带权路径。大致思想是当前节点的带权路径,是左右子树的带权路径之和

过程:

  1. 先判断 tree 是否为空,如果为空,就直接返回 0。为了处理左子树或者右子树为空的情况
  2. 然后判断当前节点是否为叶子,如果是叶子,直接返回叶子的带权路径
  3. 如果不是叶子,就计算左右子树的带权路径,将其相加并返回

测试代码:

javascript 复制代码
const data2 = [0,1];
const tree2 = generateWeightTree(data2, 1);
console.log(getWeight(tree2)); // 0

测试用小树来测试更方便,按照代码,tree2 只有一个节点,路径长度为 0, 所以带权路径长度为 0;输出结果正确

javascript 复制代码
const data3 = [0,1,2,3];
const tree3 = generateWeightTree(data3, 1);
console.log(getWeight(tree3)); // 5

按照代码,tree3 有三个节点,分别是 1,2,3;节点 2节点 3节点 1 的左右子树,像下面这样,显然 WPL 是 5。

  1
 / \
2   3

代码没问题,测试完成

看看最开始生成的树的WPL

js 复制代码
console.log(getWeight(tree)); // 107

总结:

这篇文章分享了如何计算二叉树的 WPL 的 JS 代码实现。问题不难,关键在于如何前序遍历二叉树,还有如何在遍历的过程中,记录叶子的深度。代码采用了递归方式,也很容易理解

你觉得这篇文章怎么样?喜欢就点赞+关注吧

相关推荐
new出一个对象13 分钟前
uniapp接入BMapGL百度地图
javascript·百度·uni-app
你挚爱的强哥1 小时前
✅✅✅【Vue.js】sd.js基于jQuery Ajax最新原生完整版for凯哥API版本
javascript·vue.js·jquery
LNTON羚通2 小时前
摄像机视频分析软件下载LiteAIServer视频智能分析平台玩手机打电话检测算法技术的实现
算法·目标检测·音视频·监控·视频监控
前端Hardy2 小时前
纯HTML&CSS实现3D旋转地球
前端·javascript·css·3d·html
susu10830189112 小时前
vue3中父div设置display flex,2个子div重叠
前端·javascript·vue.js
哭泣的眼泪4083 小时前
解析粗糙度仪在工业制造及材料科学和建筑工程领域的重要性
python·算法·django·virtualenv·pygame
Microsoft Word4 小时前
c++基础语法
开发语言·c++·算法
天才在此4 小时前
汽车加油行驶问题-动态规划算法(已在洛谷AC)
算法·动态规划
小镇程序员5 小时前
vue2 src_Todolist全局总线事件版本
前端·javascript·vue.js
莫叫石榴姐5 小时前
数据科学与SQL:组距分组分析 | 区间分布问题
大数据·人工智能·sql·深度学习·算法·机器学习·数据挖掘