二叉树的带权路径长度WPL是二叉树中所有叶结点的带权路径长度之和。给定一棵二叉树T采用二叉链表存储结点结构如下leftweightright其中叶结点的weight域保存该结点的非负权值。设root为指向T的根结点的指针请设计求T的WPL的算法要求1给出算法的基本设计思想。2使用C或C++语言给出二叉树结点的数据类型定义。3根据设计思想采用C或C++语言描述算法关键之处给出注释。
-
基本设计思想:
- 递归地遍历二叉树,计算每个叶节点的带权路径长度(即从根节点到该叶节点的路径长度乘以该叶节点的权值)
- 将所有叶节点的带权路径长度累加,得到二叉树的带权路径长度
-
二叉树节点的数据类型定义(C++语言):
struct TreeNode {
int weight;
TreeNode* left;
TreeNode* right;
};
- 算法描述(C++语言):
// 计算二叉树的带权路径长度
int getWPL(TreeNode* root) {
if (root == nullptr) {
return 0;
}
if (root->left == nullptr && root->right == nullptr) {
return root->weight;
}
// 递归地计算左子树和右子树的带权路径长度
int leftWPL = getWPL(root->left);
int rightWPL = getWPL(root->right);
// 返回左子树和右子树的带权路径长度之和
return leftWPL + rightWPL + root->weight;
}
算法说明:
- 首先判断当前节点是否为空,若为空则返回0。
- 若当前节点是叶节点(即左右子节点均为空),则返回该叶节点的权值。
- 否则,递归地计算左子树和右子树的带权路径长度,并将其累加上当前节点的权值,作为当前树的带权路径长度。
原文地址: https://www.cveoy.top/t/topic/i2XG 著作权归作者所有。请勿转载和采集!