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):定義為樹中所有葉結點的帶權路徑長度之和。 結點的帶權路徑長度:結點到樹根之間的路徑長度與該結點上權的乘積。 哈夫曼樹是一種帶權路徑長度最短的二叉樹,也稱為最優二叉樹。 例:對於給定的一組