4-1-7 二叉樹及其遍歷 家譜處理 (30 分)
阿新 • • 發佈:2021-02-16
技術標籤:陳越-資料結構
原始碼部落格
在原部落格的基礎上加了一些註釋
統計個數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;
}