1. 程式人生 > 其它 >4-1-7 二叉樹及其遍歷 家譜處理 (30 分)

4-1-7 二叉樹及其遍歷 家譜處理 (30 分)

技術標籤:陳越-資料結構

原始碼部落格
在原部落格的基礎上加了一些註釋
統計個數count的用法

count()用來統計元素出現的次數:count(first,last,value); first是容器的首迭代器,last是容器的末迭代器,value是詢問的元素,可以使用在容器,陣列,字串中,用於統計元素出現的次數。

#include<iostream>
#include<string>
#include<algorithm>
#include<map>
using namespace std;
int main()
{
	string name[
200];//存人物名字 map<string, string>father; int number, times; cin >> number >> times; getchar();//讀掉反斜槓 for (int t = 0; t < number; t++) { string str; getline(cin,str);//要把前面的空格讀進去 int cnt = count(str.begin(), str.end(),' ');//計數空格的個數 if (cnt == 0) { father[str] = "no"
;//起始祖宗沒有父親 name[0] = str; } else { str = str.substr(cnt); father[str] = name[cnt / 2 - 1];//儲存每個人名的父親 name[cnt / 2] = str; //每出現一個同輩份的就會把之前的資料覆蓋掉, //但其實name陣列只是為了找當前字串的父母,所以不影響 } } for (int i = 0; i < times; i++) { string name1, none,relation, name2; cin >> name1 >>
none >> none >> relation >> none >> name2; switch (relation[0]) { case 'c': //child swap(name1, name2);//這裡沒有break,換位置後判斷,是等效的 case 'p': //father if (father[name2] == name1) printf("True\n"); else printf("False\n"); break; case 'd': //descendant swap(name1, name2); case 'a': //ancestor while (father[name2] != name1&&father[name2]!="no") name2 = father[name2]; //往上一直找name2的父親節點,當name2的父親節點==name1或者 //查到了初始祖宗那就跳出 if (father[name2] == name1) printf("True\n");//往上父親節點是一致的 else printf("False\n");//追查到了原始祖宗並且也不一樣 break; case 's': //sibling(只算親兄妹,表兄妹之類的不算) if (father[name2] == father[name1]) printf("True\n"); else printf("False\n"); break; } } return 0; }