• HDU-1710-二叉树


     1 #include <iostream>
     2 using namespace std;
     3 
     4 typedef long long ll;
     5 
     6 const int maxn = 1010;
     7 
     8 // 输入先序遍历和中序遍历, 求后序遍历;
     9 
    10 int pre[maxn], in[maxn], post[maxn];
    11 int k;
    12 
    13 struct node
    14 {
    15     int value;
    16     node *l, *r;
    17     node(int value = 0, node *l = nullptr, node *r = nullptr):
    18         value(value), l(l), r(r){}
    19 };
    20 
    21 void buildtree_dfs(int l, int r, int &t, node* &root)
    22 {
    23     int flag = -1;
    24     for(int i = l; i <= r; i++)
    25     {
    26         if(in[i] == pre[t])
    27         {
    28             flag = i;
    29             break;
    30         }
    31     }
    32     if(flag == -1) return;
    33     root = new node(in[flag]);
    34     t++;
    35     if(flag > l) buildtree_dfs(l, flag - 1, t, root->l);
    36     if(flag < r) buildtree_dfs(flag + 1, r, t, root->r);
    37 }
    38 
    39 void preorder(node *root)
    40 {
    41     if(root != nullptr)
    42     {
    43         post[k++] = root->value;
    44         preorder(root->l);
    45         preorder(root->r);
    46     }
    47 }
    48 
    49 void inorder(node *root)
    50 {
    51     if(root != nullptr)
    52     {
    53         inorder(root->l);
    54         post[k++] = root->value;
    55         inorder(root->r);
    56     }
    57 }
    58 
    59 void postorder(node *root)
    60 {
    61     if(root != nullptr)
    62     {
    63         postorder(root->l);
    64         postorder(root->r);
    65         post[k++] = root->value;
    66     }
    67 }
    68 
    69 int main()
    70 {
    71     int n;
    72     while(cin >> n)
    73     {
    74         for(int i = 1; i <= n; i++) cin >> pre[i];
    75         for(int i = 1; i <= n; i++) cin >> in[i];
    76         node *root;
    77         int t = 1;
    78         buildtree_dfs(1, n, t, root);
    79         k = 0;
    80         postorder(root);
    81         for(int i = 0; i < k; i++)
    82         {
    83             cout << post[i];
    84             if(i != k - 1) cout << " ";
    85         }
    86         cout << endl;
    87     }
    88     return 0;
    89 }
  • 相关阅读:
    Wannafly挑战赛21A
    luoguP4000 斐波那契数列
    关于斐波那契数模意义下的循环节问题
    Codeforces Round #501 (Div. 3) F. Bracket Substring
    1257: [CQOI2007]余数之和
    51nod1380 夹克老爷的逢三抽一
    51nod1423 最大二"货" 单调栈
    51nod1624 取余最长路 前缀和 + set
    51nod1437 迈克步 单调栈
    51nod1515 明辨是非 并查集 + set
  • 原文地址:https://www.cnblogs.com/zny0222/p/13635243.html
Copyright © 2020-2023  润新知