東華大學上機題——計算葉子節點數目
題目描述:
從數據結構中樹的定義可知,除根節點外,樹中的每個節點都有唯一的一個雙親結點。根據這一特性,可用一組連續的存儲空間(一維數組)存儲樹中的各節點。樹中的結點除保存本身結點的信息外,還要保存其雙親結點在數組中的位置(即在數組中的下標。雙親的信息爲-1則表示該結點爲根節點),樹的這種表示方法稱爲雙親表示法。
樹中的每個結點的數據類型定義如下:
struct PTNode{
char data;//結點數據域
int parent;//結點雙親在數組中的位置
};
樹的數據類型定義如下:
#define MAX_TREE_SIZE 100
struct PTree {
PTNode nodes[MAX_TREE_SIZE];//存儲樹中的所有結點
int n;//樹中的結點數,n不超過100
};
則下圖所示的樹中,按照雙親表示法存儲結構,存儲爲下圖所示的形式(n爲10)。
已知一棵樹已存儲以上形式,請編寫函數GetLeavesCount,計算葉子節點數目。
GetLeavesCount的函數原型爲:int GetLeavesCount(PTree T)
其中,形參T中保存了樹中節點數目以及圖b所示的結點數組,函數返回葉子結點的數目。
比如:對圖中的數調用函數GetLeavesCount(T),返回結果爲6
輸入的第一個數n表示樹中的結點數,此後有n行輸入,每行表示一個結點的信息,第一個信息爲結點的數據,第二個信息爲結點的雙親結點在數組中的位置。
如輸入:
10
a -1
b 0
c 0
d 0
e 1
f 1
g 1
h 2
i 3
h 3
則創建圖中對應的數。
對此樹調用函數GetLeavesCount(T),返回結果爲6.
如輸入:
8
a -1
b 0
e 1
h 2
c 0
d 0
f 5
g 5
對此樹調用GetLeavesCount(T),返回結果爲4
算法思想:
遍歷結點數組,當該結點的序號有另外一個結點指向時,那麼該結點爲非葉子結點,當遍歷完結點時,沒有一個結點的指針指向該序號的話,那麼該結點即使葉節點。這裏轉換一下思考方式,統計非葉子結點的個數會更容易一點。
#include<iostream>
using namespace std;
struct PTNode{
char data;//結點數據域
int parent;//結點雙親在數組中的位置
};
#define MAX_TREE_SIZE 100
struct PTree {
PTNode nodes[MAX_TREE_SIZE];//存儲樹中的所有結點
int n;//樹中的結點數,n不超過100
};
int GetLeavesCount(PTree T) {
int count = 0;//用來存儲非葉子結點的個數
for (int i = 0;i < T.n;i++) {
for (int j = 0;j < T.n;j++) {
if (i == j)
continue;//自己不和自己比較
if (i == T.nodes[j].parent) {//檢測到該結點有葉子結點
count++;//非葉子結點數增加
break;//不重複計算該結點
}
}
}
return T.n - count;//返回葉子結點數
}
int main() {
int n;
cout << "輸入結點個數:";
cin >> n;
PTree T;
T.n = n;
cout << "輸入結點信息:" << endl;
for (int i = 0;i < n;i++) {
cin >> T.nodes[i].data >> T.nodes[i].parent;
}
cout << "葉子結點個數爲:" << GetLeavesCount(T) << endl;
return 0;
}
運行測試結果: