zoukankan      html  css  js  c++  java
  • 【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
  • 相关阅读:
    设计模式 单件-Singleton
    积累PDU
    设计模式 工厂-Factory
    设计模式 策略-Strategy,装饰-Decorator,观察者-Observer
    Java多线程编程
    Red Hat Linux认证
    认识Agile,Scrum和DevOps
    FPDF中文应用攻略
    ERROR 1010 (HY000): Error dropping database (can't rmdir '.kehuanedu_db', errno: 41)
    xampp修改mysql的默认空密码
  • 原文地址:https://www.cnblogs.com/zhangwanying/p/7643447.html
Copyright © 2011-2022 走看看