计算二叉树叶子结点的带权路径长度WPL
#include <stdio.h>
#include <stdlib.h>
typedef struct BiTNode
{
char key;
int weight;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
int CreateBiTree(BiTree *T);
void PreOrderTraverse(BiTree T,int k);
int sum=0;
int main()
{
BiTree *T;
T=(BiTree*)malloc(sizeof(BiTree));
CreateBiTree(T);
printf("\n前序遍历结果:");
PreOrderTraverse(*T,0);
printf("\nThe WPL is %d\n",sum);
return 0;
}
//---创建二叉树---//
int CreateBiTree(BiTree *T)
{
fflush(stdin);
printf("please input the node char:");
char ch;
scanf("%c",&ch);
BiTree p;
p=(BiTree)malloc(sizeof(BiTNode));
p->key=ch;
*T=p;
char l,r;
fflush(stdin);
printf("Dose %c has left child(y--yes,n--no):",ch);
scanf("%c",&l);
if(l=='y')
CreateBiTree(&(*T)->lchild);
else
(*T)->lchild=NULL;
fflush(stdin);
printf("Dose %c has right child(y--yes,n--no):",ch);
scanf("%c",&r);
if(r=='y')
CreateBiTree(&(*T)->rchild);
else
(*T)->rchild=NULL;
if(l=='n' && r=='n')
{
printf("What is the weight:");
scanf("%d",&(*T)->weight);
}
return 0;
}
//---前序遍历各结点,当结点无左、右子树,则为叶子结点,将其weight乘以层数并累加至sum---//
void PreOrderTraverse(BiTree T,int k)
{
if(T)
{
if(T->lchild || T->rchild)
{
PreOrderTraverse(T->lchild,k+1);
PreOrderTraverse(T->rchild,k+1);
}
else
{
sum+=T->weight*k;
printf("sum=%d k=%d\n",sum,k);
}
}
}