层次遍历(广搜),如果没有规定节点结构可以再节点里设置一个深度标记,更简单。
typedef struct BiTNode{
struct BiTNode *lchild,*rchild;
int weight;
}BiTNode,*BiTree;
int wpl(BiTree T){
if(!T) return 0;
int front=0,rear=0; //front指向队首,rear指向队尾的后一个位置
int last=0,level=0; //last指向当前层的最右节点
BiTree Q[MaxSize];
Q[rear++]=T; //根节点入队
BiTree p;
int dep=0,sum=0;
while(front<rear){
p=Q[front++]; //出队
if(!p->lchild&&!p->rchild) sum+=dep*p->weight; //如果是叶子节点,更新sum
if(p->lchild){
Q[rear++]=p->lchild;
}
if(p->rchild){
Q[rear++]=p->rchild;
}
if(front-1==last){ //刚出队的元素是否为当前层的最右节点节点
dep++;
last=rear-1; //更新last
}
}
return sum;
}
先序遍历(深搜)
typedef struct BiTNode{
struct BiTNode *lchild,*rchild;
int weight;
}BiTNode,*BiTree;
int sum=0; //定义一个全局变量
void wpl(BiTree T,int dep){ //初始传入根节点和0
if(!T) return;
if(!T->lchild&&!T->rchild){
sum+=dep*T->weight;
}
wpl(T->lchild,dep+1);
wpl(T->rchild,dep+1);
}