# [置顶] 2014年计算机联考真题——带权路径长度之和

433人阅读 评论(0)

        //求叶子节点带权路径长度之和
int WPL(BinaryTree* T){
BinaryTree* queue[100];         //构造容量足够大的队列
BinaryTree* cur = T;            //指向根节点指针
int front = -1,rear = -1;       //队头与队尾指针
//last指向每层的最后一个结点，level代表层数
int last = 0,level = 0;
int sum = 0;                //带权路径长度之和
queue[++rear] = cur;        //根节点入队
level++;
//队列不为空一直进行循环
while(front < rear){
cur = queue[++front];   //根结点出队
if(cur->lchild == NULL && cur->rchild == NULL){
int weight = cur->data-'0';
sum += (level-1)*weight;
}
//左孩子非空入队
if(cur->lchild){
queue[++rear] = cur->lchild;
}
//右孩子非空入队
if(cur->rchild){
queue[++rear] = cur->rchild;
}
//队头指针是该层最后一个结点时
if(front == last){
level++;                //层数加一
//最后一个结点指针下移到下一层的最后一个结点
last = rear;
}
}
return sum;
} 

#include <iostream>
using namespace std;

class BinaryTree{
private:
char data;
BinaryTree* lchild;
BinaryTree* rchild;
public:
//二叉树的初始化函数
BinaryTree* Create_BinaryTree(){
BinaryTree* T = new BinaryTree;
char ch;
cin>>ch;
if(ch == '#'){                                                  //“#”是结束标志
T = NULL;
}else{
T->data = ch;                                               //对当前结点初始化
T->lchild = Create_BinaryTree();                            //递归构造左子树
T->rchild = Create_BinaryTree();                            //递归构造右子树
}
return T;
}

//求叶子节点带权路径长度之和
int WPL(BinaryTree* T){
BinaryTree* queue[100];         //构造容量足够大的队列
BinaryTree* cur = T;            //指向根节点指针
int front = -1,rear = -1;       //队头与队尾指针
//last指向每层的最后一个结点，level代表层数
int last = 0,level = 0;
int sum = 0;                //带权路径长度之和
queue[++rear] = cur;        //根节点入队
level++;
//队列不为空一直进行循环
while(front < rear){
cur = queue[++front];   //根结点出队
if(cur->lchild == NULL && cur->rchild == NULL){
int weight = cur->data-'0';
sum += (level-1)*weight;
}
//左孩子非空入队
if(cur->lchild){
queue[++rear] = cur->lchild;
}
//右孩子非空入队
if(cur->rchild){
queue[++rear] = cur->rchild;
}
//队头指针是该层最后一个结点时
if(front == last){
level++;                //层数加一
//最后一个结点指针下移到下一层的最后一个结点
last = rear;
}
}
return sum;
}
};

int main()
{
cout<<"请初始化二叉树:"<<endl;
BinaryTree* T;
T = T->Create_BinaryTree();

cout<<"叶子节点的带权路径之和为:"<<endl;
int wpl = T->WPL(T);
cout<<wpl<<endl;

return 0;
} 

1
0

个人资料
• 访问：155553次
• 积分：4927
• 等级：
• 排名：第6843名
• 原创：329篇
• 转载：0篇
• 译文：0篇
• 评论：80条
博客专栏
 数据结构与算法 文章：71篇 阅读：32636
 面试在线编程专栏 文章：71篇 阅读：31064
 数学建模专栏 文章：11篇 阅读：31980
 机器学习数据挖掘笔记 文章：10篇 阅读：10067
最新评论