王道p150 19.二叉树的带权路径长度 (WPL)是二叉树中所有叶结点的带权路径长度之和.给定一棵二叉树T,采用二叉链表存储.设计求T的 WPL的算法(c语言代码实现,注释详解)

若该结点是叶结点,则变量 wpl 加上该结点的深度与权值的乘积。若该结点是非叶结点,则左子树不为空时,对左子树调用递归算法。右子树不为空,对右子树调用递归算法,传进去的深度均为本结点的深度加 1。

本题代码如下

int wpl_pre(tree* t, int deep)
{
	// 定义一个静态整型变量wpl,用于保存带权路径长度,初始值为0  
	static int wpl = 0;
	// 如果当前节点没有左右孩子,则将其权重乘上深度值加到wpl上  
	if ((*t)->lchild == NULL && (*t)->rchild == NULL)
		wpl += deep * (((*t)->weight) - '0');
	// 如果当前节点有左孩子,则递归计算左子树的带权路径长度  
	if ((*t)->lchild != NULL)
		wpl_pre(&(*t)->lchild, deep + 1);
	// 如果当前节点有右孩子,则递归计算右子树的带权路径长度  
	if ((*t)->rchild != NULL)
		wpl_pre(&(*t)->rchild, deep + 1); 
	return wpl;
}

完整测试代码

#include
#include
typedef struct treenode
{
	int weight;
	struct treenode* lchild, * rchild;
}treenode,*tree;
void buildtree(tree* t)
{
	int ch;
	ch = getchar();
	if (ch == '#')
		*t = NULL;
	else
	{
		*t = (treenode*)malloc(sizeof(treenode));
		(*t)->weight= ch;
		(*t)->lchild = NULL;
		(*t)->rchild = NULL;
		buildtree(&(*t)->lchild);
		buildtree(&(*t)->rchild);
	}
}  
int wpl_pre(tree* t, int deep)
{
	// 定义一个静态整型变量wpl,用于保存带权路径长度,初始值为0  
	static int wpl = 0;
	// 如果当前节点没有左右孩子,则将其权重乘上深度值加到wpl上  
	if ((*t)->lchild == NULL && (*t)->rchild == NULL)
		wpl += deep * (((*t)->weight) - '0');
	// 如果当前节点有左孩子,则递归计算左子树的带权路径长度  
	if ((*t)->lchild != NULL)
		wpl_pre(&(*t)->lchild, deep + 1);
	// 如果当前节点有右孩子,则递归计算右子树的带权路径长度  
	if ((*t)->rchild != NULL)
		wpl_pre(&(*t)->rchild, deep + 1); 
	return wpl;
}
int main()
{
	tree t;
	buildtree(&t);
	int w=wpl_pre(&t,0);
	printf("二叉树的带权路径长度wpl为:%d", w);
	return 0;
}

用124##5##36##7##

/*        1

        2               3

4            5    6            7

*/

你可能感兴趣的:(树,数据结构,c语言,树,链表,算法)