【Luogu】【关卡2-14】 树形数据结构(2017年10月)【AK】

任务说明:由一个根节点分叉,越分越多,就成了树。树可以表示数据之间的从属关系

P1087 FBI树

给一个01字符串,0对应B,1对应I,F对应既有0子节点又有1子节点的根节点,输出这棵树的后序遍历。字符串长度小于等于2^10。

心情好,写代码一次ac了

 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 }
View Code

 P1030 求先序排列

给两个字符串,表示一棵树的中序遍历和后序遍历,要求输出这棵树的先序遍历。

我是模拟了这棵树,先建树,然后先序遍历的。

但是还可以有更好的解法,不用建树,直接dfs就ok!!!!

 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 }
View Code

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,然后递归的找左儿子的儿子进栈。

 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 }
View Code
原文地址:https://www.cnblogs.com/zhangwanying/p/7643447.html