東華大學上機題——計算葉子節點數目

東華大學上機題——計算葉子節點數目

題目描述:
從數據結構中樹的定義可知,除根節點外,樹中的每個節點都有唯一的一個雙親結點。根據這一特性,可用一組連續的存儲空間(一維數組)存儲樹中的各節點。樹中的結點除保存本身結點的信息外,還要保存其雙親結點在數組中的位置(即在數組中的下標。雙親的信息爲-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;
}

運行測試結果:
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章