【Luogu】【关卡2-14】 树形数据结构(2017年10月)【AK】
任务说明:由一个根节点分叉,越分越多,就成了树。树可以表示数据之间的从属关系
P1087 FBI树
给一个01字符串,0对应B,1对应I,F对应既有0子节点又有1子节点的根节点,输出这棵树的后序遍历。字符串长度小于等于2^10。
心情好,写代码一次ac了
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <stack> 5 #include <map> 6 #include <vector> 7 #include <string> 8 9 using namespace std; 10 11 void init(string& str) { 12 if (str.empty()) { 13 return; 14 } 15 if (str.size() == 1) { 16 if (str == "0") { cout << "B"; } 17 else if (str == "1") { cout << "I"; } 18 return; 19 } 20 string s1 = str.substr(0, str.size()/2); 21 string s2 = str.substr(str.size()/2); 22 init(s1); 23 init(s2); 24 if (str.find("0") != string::npos && str.find("1") != string::npos) { 25 cout << "F"; 26 } else if (str.find("0") != string::npos) { 27 cout << "B"; 28 } else { 29 cout << "I"; 30 } 31 return; 32 } 33 34 35 int main() { 36 int n; 37 cin >> n; 38 string str; 39 cin >> str; 40 init(str); 41 cout << endl; 42 //system("pause"); 43 return 0; 44 }
P1030 求先序排列
给两个字符串,表示一棵树的中序遍历和后序遍历,要求输出这棵树的先序遍历。
我是模拟了这棵树,先建树,然后先序遍历的。
但是还可以有更好的解法,不用建树,直接dfs就ok!!!!
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 5 using namespace std; 6 7 struct TreeNode { 8 char val; 9 TreeNode* left = nullptr; 10 TreeNode* right = nullptr; 11 }; 12 13 TreeNode* initTree(string& str1, string& str2) { 14 if (str1.empty() && str2.empty()) { 15 return nullptr; 16 } 17 char c = str2[str2.size()-1]; 18 TreeNode* root = new(TreeNode); 19 root->val = c; 20 int str1Pos = str1.find(c); 21 string str1Left = str1.substr(0, str1Pos); 22 23 string str1Right = str1.substr(str1Pos + 1); 24 25 string str2Left = str2.substr(0, str1Pos); 26 27 string str2Right = str2.substr(str1Pos, str1Right.size()); 28 29 root->left = initTree(str1Left, str2Left); 30 root->right = initTree(str1Right, str2Right); 31 return root; 32 } 33 34 string strans = ""; 35 void visitTree(TreeNode* root) { 36 if (!root) { return; } 37 strans += root->val; 38 visitTree(root->left); 39 visitTree(root->right); 40 return; 41 } 42 43 44 int main() { 45 string s1, s2; 46 cin >> s1 >> s2; 47 TreeNode* root = initTree(s1, s2); 48 visitTree(root); 49 cout << strans << endl; 50 return 0; 51 }
P1305 新二叉树
这个题目写segment fault了,要用gdb看堆栈....orz
Linix 查看core文件配置方法如下: http://www.jianshu.com/p/5549a6e71a1d
怎么用gdb看堆栈,看内存这里还是需要强化...最后发现问题的方法还是输出屏幕看log。。orz
segment fault 的原因是:
1 //没有判断top是否存在就pop了,踩内存了orz 2 while ( stk.top() == '*') { stk.pop(); } //wrong 3 while (!stk.empty() && stk.top() == '*') { stk.pop(); } //correct
以后要注意,判断一个值的时候一定要先写这个值能不能存在orz
题目是:输入一串二叉树,用遍历前序打出。
输入格式:
第一行为二叉树的节点数n。
后面n行,每一个字母为节点,后两个字母分别为其左右儿子。
空节点用*表示
输出格式:前序排列的二叉树
想法就是先找根节点,然后用个栈来保存左右儿子。左儿子先pop,然后递归的找左儿子的儿子进栈。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <stack> 5 #include <map> 6 #include <vector> 7 8 using namespace std; 9 10 int n; 11 map<char, int> mp; 12 stack<char> stk; 13 14 int main() { 15 cin >> n; 16 vector<vector<char>> info(n, vector<char>(3)); 17 for (int i = 0; i < n; ++i) { 18 getchar(); 19 //scanf("%c%c%c", &info[i][0], &info[i][1], &info[i][2]); 20 cin >> info[i][0] >> info[i][1] >> info[i][2]; 21 mp[info[i][0]]++, mp[info[i][1]]++, mp[info[i][2]]++; 22 23 } 24 char rootval = '='; 25 for (auto ele : mp) { 26 if (ele.second == 1) { 27 rootval = ele.first; 28 } 29 } 30 stk.push(rootval); 31 int times = 0; 32 while(!stk.empty()) { 33 while (!stk.empty() && stk.top() == '*') { stk.pop(); } 34 if (stk.empty()) { break; } 35 char ch = stk.top(); 36 stk.pop(); 37 for (int i = 0; i < n; ++i) { 38 if (info[i][0] == ch) { 39 stk.push(info[i][2]); 40 stk.push(info[i][1]); 41 } 42 } 43 cout << ch ; 44 } 45 return 0; 46 }