算法一
int wpl(BiTree t, int deep){
static int wp=0;
if(t->lchild==NULL && t->rchild==NULL){
wp+=deep*t->weight;
}
if(t->lchild) wpl(t->lchild, deep+1);
if(t->rchild) wpl(t->rchild, deep+1);
return wp;
}
算法二
int wpl_2(BiTree t){
BiTree queue[maxsize];
int front=-1,rear=-1;
int lastNode = 0;
int wpl=0;
int deep=0;
BiTree temp;
queue[++rear] = t;
while(front!=rear){
temp = queue[++front];
if(temp->lchild==NULL && temp->rchild==NULL){
wpl+=temp->weight*deep;
}
if(temp->lchild){
queue[++rear] = temp->lchild;
}
if(temp->rchild){
queue[++rear] = temp->rchild;
}
if(lastNode==front){
lastNode = rear;
deep++;
}
}
return wpl;
}
测试环境
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxsize 100
//二叉树的创建序列
//1 2 4 0 0 0 3 0 0
//1 2 4 0 0 5 0 0 3 0 0
typedef struct BiNode{
int weight;
struct BiNode *lchild,*rchild;
}BiNode,*BiTree;
int wpl_2(BiTree t);
BiNode* CreateBiTree();
void Traverse(BiNode *p);
int wpl(BiTree t, int deep=0);
int main(){
BiTree t = CreateBiTree();
printf("%d",wpl_2(t));
printf("\n%d",wpl(t));
return 0;
}
//用递归的算法求二叉树叶子结点的带权路径总和
int wpl(BiTree t, int deep){
static int wp=0;
if(t->lchild==NULL && t->rchild==NULL){
wp+=deep*t->weight;
}
if(t->lchild) wpl(t->lchild, deep+1);
if(t->rchild) wpl(t->rchild, deep+1);
return wp;
}
int wpl_2(BiTree t){
BiTree queue[maxsize];
int front=-1,rear=-1;
int lastNode = 0;
int wpl=0;
int deep=0;
BiTree temp;
queue[++rear] = t;
while(front!=rear){
temp = queue[++front];
if(temp->lchild==NULL && temp->rchild==NULL){
wpl+=temp->weight*deep;
}
if(temp->lchild){
queue[++rear] = temp->lchild;
}
if(temp->rchild){
queue[++rear] = temp->rchild;
}
if(lastNode==front){
lastNode = rear;
deep++;
}
}
return wpl;
}
//用递归方法以中序遍历的方式创建二叉树
BiNode* CreateBiTree(){
BiNode *p;
char a;
scanf("%d",&a);
if(a==0)
p=NULL;
else{
p=(BiNode *)malloc(sizeof(BiNode));
p->weight=a;
p->lchild=CreateBiTree();
p->rchild=CreateBiTree();
}
return p;
}
//递归方法中序遍历二叉树
void Traverse(BiNode *p){
if(p==NULL){
return;
}
else{
Traverse(p->lchild);
printf("%d",p->weight);
Traverse(p->rchild);
}
return;
}