2014年计算机联考真题——带权路径长度之和

来源:互联网 发布:云计算 中国 编辑:程序博客网 时间:2024/06/07 10:00

这里写图片描述


思路如下:
利用层次遍历的思路,记录每层的层数level,对于该层的每个叶节点的带权路径长度 = data*(level-1)
算法如下:

        //求叶子节点带权路径长度之和        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; } 

截图如下:
这里写图片描述

原创粉丝点击