• pta 编程题8 Tree Traversals Again


    其它pta数据结构编程题请参见:pta

    这次的作业考察的是树的遍历。

    题目的输入通过栈的pop给出了树的中序遍历的顺序。根据push和pop的顺序构造树的方法为:定义一个变量father来确定父节点,如果父节点还没有pop,那么push操作就构造父节点的左子树,否则构造父节点的右子树;定义一个栈用来确定pop操作弹出的节点,将father赋值为pop的节点,并将此节点的flag值(用来标记已经pop过)标为1。

     1 #include <iostream>
     2 #include <string>
     3 #include <vector>
     4 using namespace std;
     5 
     6 struct Stack
     7 {
     8     int data[31];
     9     int top = -1;
    10 };
    11 
    12 struct Node
    13 {
    14     int left;
    15     int right;
    16     int flag;//has poped
    17 }tree[31];
    18 
    19 Node initNode();
    20 void push(Stack &s, int i);
    21 int pop(Stack &s);
    22 void postOrder(int i, vector<int> &v);
    23 
    24 int main()
    25 {
    26     int num, t, i;
    27     int root, father = -1;
    28     cin >> num;
    29     string s;
    30     Stack stack;
    31     for (i = 0; i < 2 * num; i++)
    32     {
    33         cin >> s;
    34         if (s == "Push")
    35         {
    36             cin >> t;
    37             push(stack, t);
    38             if (i == 0) root = t;
    39             else if (tree[father].flag == 0)
    40                 tree[father].left = t;
    41             else 
    42                 tree[father].right = t;//父节点已经pop过只能向右节点push
    43             tree[t] = initNode();
    44             father = t;
    45         }
    46         else
    47         {
    48             father = pop(stack);
    49             tree[father].flag = 1;
    50         }
    51     }
    52     vector<int> v;
    53     postOrder(root, v);
    54     for (int i = 0; i < v.size(); i++)
    55     {
    56         if (i) cout << " ";
    57         cout << v[i];
    58     }
    59     return 0;
    60 }
    61 
    62 Node initNode()
    63 {
    64     Node node;
    65     node.left = -1;
    66     node.right = -1;
    67     node.flag = 0;
    68     return node;
    69 }
    70 
    71 void push(Stack &s, int i)
    72 {
    73     s.data[++s.top] = i;
    74 }
    75 
    76 int pop(Stack &s)
    77 {
    78     return s.data[s.top--];
    79 }
    80 
    81 void postOrder(int i, vector<int> &v)
    82 {
    83     if (tree[i].left != -1) postOrder(tree[i].left, v);
    84     if (tree[i].right != -1) postOrder(tree[i].right, v);
    85     v.push_back(i);
    86 }
  • 相关阅读:
    APK自我保护方法
    Andorid APK反逆向解决方案---梆梆加固原理探寻
    判断android文件是否加壳
    java调用dll-JNA
    Java调用本地接口
    pat00-自测2. 素数对猜想 (20)
    pat00-自测4. Have Fun with Numbers (20)
    pat00-自测3. 数组元素循环右移问题 (20)
    pat00-自测1. 打印沙漏(20)
    pat1013. Battle Over Cities (25)
  • 原文地址:https://www.cnblogs.com/lxc1910/p/8724428.html
Copyright © 2020-2023  润新知