题目描述:
又树的带权路径长度(WPL) 是二又树中所有叶结点的带权路径长度之和。给定一棵二叉树T采用二又链表存储,结点结构如下:
left| weight | right
其中叶结点的weigh域保存该结点的非负权值。设root为指向T的根结点的指针,请设计求T的WPI的算法,要求: 1)给出算法的基本设计思想 2) 使用C或C++语言,给出二叉树结点的数据类型定义 3) 根据设计思想,采用C或C++语言描述算法,关键之处给出注释
题源:
未知
算法思想
1)给出算法的基本设计思想
可以使用先序遍历或层次遍历解决问题。
基于先序递归遍历。
用一个static变量记录WPL,把每个结点的深度作为递归函数的一个参数传递。
若该结点是叶结点,则变量WPL加上该结点的深度与权值之和。 若该结点是非叶结点,则左子树不为空时,对左子树调用递归算法,右子树不为空时,对右子树调用递归算法,深度参数均为本结点的深度参数加1。
2) 使用C或C++语言,给出二叉树结点的数据类型定义
struct tree {
//定义了一个tree类型的左孩子
tree* lchild;
//定义了一个tree类型的右孩子
tree* rchild;
//定义一个int类型的权值
int weight;
};
int sum(tree* root) {
sumtext(root , 0);
}
3) 根据设计思想,采用C或C++语言描述算法,关键之处给出注释
int sumtext(tree* root,int deep) {
//利用静态变量统计答案
static int ans = 0;
//若为非叶节点,则用权值乘以深度
if( root->lchild == NULL && root->rchild == NULL )ans += root->weight * deep;
//若左子树不为空,则遍历左子树
if( root->lchild != NULL )sumtext(root->lchild , deep + 1);
//若右子树不为空,则遍历右子树
if( root->rchild != NULL ) sumtext(root->rchild , deep + 1);
//返回答案
return ans;
}
int main() {
ListNode* list = new ListNode;
return 0;
}