二叉树的WPL计算
描述
二叉树的带权路径长度(WPL)是二叉树中所有叶结点的带权路径长度之和。给定一棵二叉树T, 采用二叉链表存储,结点结构为:left weight right,其中叶结点的weight域保存该结点的非负权值。设root为指向T的根结点的指针,请设计求T的WPL的算法。
输入
多组数据,每组数据一行,为一个二叉树的先序序列(序列中元素为0时,表示该结点为空,每两个元素之间用空格隔开)。当输入只有一个0时,输入结束。
输出
每组数据输出一行,为该二叉树的WPL。
样例输入1
1 1 0 0 1 0 0 1 2 1 0 0 0 0 0
样例输出1
2 2
解答:根据输入数据创建带权二叉树,深度优先搜索求出所有叶子结点的带权路径长度之和。
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *left,*right;
} TNode;
int x,count,flag,sum;
void Create(TNode *&T)
{
scanf("%d",&x);
count++;
if(x==0 && count==1)
{
flag=1;
return ;
}
else
{
if(x==0)
T=NULL;
else
{
T=(TNode *)malloc(sizeof(TNode));
T->data=x;
Create(T->left);
Create(T->right);
}
}
}
void DFS(TNode *T,int k)
{
if(T->left==NULL && T->right==NULL)
sum+=(T->data*k);
if(T->left)
DFS(T->left,k+1);
if(T->right)
DFS(T->right,k+1);
}
int main()
{
TNode *T;
while(1)
{
flag=0;
count=0;
Create(T);
if(flag)
break;
sum=0;
DFS(T,0);
printf("%d\n",sum);
}
return 0;
}