1. 程式人生 > >2014年計算機聯考真題——帶權路徑長度之和

2014年計算機聯考真題——帶權路徑長度之和

這裡寫圖片描述

思路如下:
利用層次遍歷的思路,記錄每層的層數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;
 } 

截圖如下:
這裡寫圖片描述

相關推薦

2014計算機——路徑長度之和

思路如下: 利用層次遍歷的思路,記錄每層的層數level,對於該層的每個葉節點的帶權路徑長度 = data*(level-1) 演算法如下: //求葉子節點帶權路徑長度

2016計算機——尋求最大子集和的差

概述 已知由n(n>=2)個正整數構成的集合A ,將其劃分成兩個不相交的子集A1和A2,元素個數分別為n1和n2,A1和A2中元素之和分別為S1和S2。設計一個儘可能高效的劃分演算法,滿足|n1-n2|最小且|S1-S2|最大。要求: 1)給出演算法的

資料結構-順序表(陣列)迴圈左移(2010

王道18頁,2010年計算機聯考真題 n(n>1)個整數放到一維陣列R中,將R中儲存的順序序列迴圈左移p(0<p<n)個位置, 即R中資料由(X0,X1...Xn-1)變換為(Xp,Xp+1...Xn-1,X0,...Xp-1) 思想:動態建立大小為p的輔

問題 1436: [藍橋杯][2014第五屆]地宮取寶

題目描述 X  國王有一個地宮寶庫。是  n  x  m  個格子的矩陣。每個格子放一件寶貝。每個寶貝貼著價值標籤。  地宮的入口在左上角,出口在右下角。  小明被帶到地宮的入口,國王要求他只能向右或向下行走。  走過某個格子時,如果那個格子中的寶貝價值比小明手中任意寶貝價

c語言網-1431-[藍橋杯][2014第五屆]分糖果

題目描述 問題描述 有n個小朋友圍坐成一圈。老師給每個小朋友隨機發偶數個糖果,然後進行下面的遊戲: 每個小朋友都把自己的糖果分一半給左手邊的孩子。 一輪分糖後,擁有奇數顆糖的孩子由老師補給1個糖果,從而變成偶數。 反覆進行這個遊戲,直到所有小朋友的糖果數都相同為止。 你的任

[藍橋杯][2014第五屆]分糖果

問題描述 有n個小朋友圍坐成一圈。老師給每個小朋友隨機發偶數個糖果,然後進行下面的遊戲: 每個小朋友都把自己的糖果分一半給左手邊的孩子。 一輪分糖後,擁有奇數顆糖的孩子由老師補給1個糖果,從而變成偶數。 反覆進行這個遊戲,直到所有小朋友的糖果數都相同為止。 你的任務是預測在已

[藍橋杯][2014第五屆]蘭頓螞蟻

蘭頓螞蟻,是於1986年,由克里斯·蘭頓提出來的,屬於細胞自動機的一種。 平面上的正方形格子被填上黑色或白色。在其中一格正方形內有一隻“螞蟻”。 螞蟻的頭部朝向為:上下左右其中一方。 螞蟻的移動規則十分簡單: 若螞蟻在黑格,右轉90度,將該格改為白格,並向前移一格; 若螞蟻在白格,

【2016】408(RIP演算法)

假設R1,R2,R3採用RIP協議交換路由資訊,且均已收斂。若R3檢測到網路201.1.2.0/25不可達,並向R2通告一次新的距離向量,則R2更新後,其到達該網路的距離是:BA. 2    B.3    C. 16    D. 17解析:因為R3檢測到網路201.1.2.0

2002 2017 求二叉樹的路徑長度

題目:二叉樹的帶權路徑長度(WPL)是二叉樹中所有葉節點的帶權路徑長度之和。給定一個二叉樹T,採用二叉連結串列儲存,節點結構為: left weight right 其中葉結點的weight域儲存該節點的非負權值。設root為指向T的根節點的指標,設計求WPL的演算法。 解答: 基本設計思想

用n個值構造的哈夫曼樹的路徑長度

//哈夫曼樹 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm&

資料結構——哈夫曼樹求最小WPL(樹的路徑長度

給出程式碼與註釋 #include<queue> #include<iostream> using namespace std; //代表小堆頂的優先佇列 priority_queue<long long, vector<long long>, gre

給定結點值,求哈夫曼樹的路徑長度

1.哈夫曼樹概念一棵樹中,從任意一個結點到達另一個結點的通路叫做路徑,該路徑包含的邊的個數稱為路徑長度,每個結點帶有的表示某種意義的值成為權值。從根結點到葉子結點的路徑長度乘以葉子節點權值,得到的值為該節點的帶權路徑長度,樹中所有葉子節點的帶權路徑長度之和稱為該樹的帶權路徑長

路徑長度 層次遍歷

思路:層次遍歷 帶權路徑長度:結點具有權值,從該結點到根之間的路徑長度乘以結點的權值,就是該結點的帶權路徑長度。 葉子結點的帶權路徑長度:從葉結點到根之間的路徑長度(所在層數-1)乘以葉結點的權值。

求二叉樹的路徑長度(深搜或廣搜)

下面說說這道題目。樹的帶權路徑長度(Weighted Path Length)定義:樹中所有葉子的帶權路徑長度之和。比如下面這棵樹,WPL就是3*2+7*1 = 13。 2 / \

哈夫曼樹建立與求最短路徑長度

#include<stdio.h> #include<stdlib.h> #define n 7                      //假設有七個節點元素 struct Element {     int flag;     int weig

哈夫曼編碼計算路徑長度問題

哈夫曼樹,又稱最優二叉樹,是一類帶權路徑長度最短的樹。  也就是根節點到節點的中的長度最小,當然條件就是,每條路徑都是有權重的,  所謂樹的帶權路徑長度,就是樹中所有的葉結點的權值乘上其到根結點的 路徑長度(若根結點為0層,葉結點到根結點的路徑長度為葉結點的層數)。樹的帶

哈夫曼樹與路徑長度計算

假設我們一個權重為1,7,3,13,12,15,24怎麼樣畫出哈夫曼樹和計算帶權路徑長度。 首先,選出最小的兩個權重值,這裡是1,3(矩形表示葉子節點,圓表示根節點也是兩個葉子節點的和)如圖: 然後,選出第三小的7,算出父節點,如圖: 依次類推:   當11

構造哈夫曼樹並求路徑長度(c語言/CodeBlocks實現)

#include <iostream> #include <stdio.h> #include <stdlib.h> #include <math.h>

哈夫曼樹結構和路徑長度計算

什麼是哈夫曼樹呢? 哈夫曼樹是一種帶權路徑長度最短的二叉樹,也稱為最優二叉樹。下面用一幅圖來說明。 它們的帶權路徑長度分別為: 圖a: WPL=5*2+7*2+2*2+13*2=54 圖b: WPL=5*3+2*3+7*2+13*1=48 可見,圖b的

哈夫曼樹 和 樹的路徑長度

樹的帶權路徑長度(Weighted Path Length of Tree):定義為樹中所有葉結點的帶權路徑長度之和。 結點的帶權路徑長度:結點到樹根之間的路徑長度與該結點上權的乘積。 哈夫曼樹是一種帶權路徑長度最短的二叉樹,也稱為最優二叉樹。 例:對於給定的一組