Day45:二叉树带权路径长度

209 阅读2分钟

题目描述:

又树的带权路径长度(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;
}