1127 ZigZagging on a Tree (30 分)后序中序建树

①做到的遍历题,基本不会直接考前中后序了,会再原来的基础上,新定义一种遍历方法,往往只需要改极少的一部分代码,比如invert binary tree,只需要先访问右孩子再访问左孩子,而不需要真正的反转,本题也不需要额外设计一个zigzag遍历函数,只要bfs然后一行正者输出一行逆着输出
②!!!就因为少写了 if(i>=v.size()) break;,一开始被扣了14分,真感觉是个大错误,没想到就少了这个,再循环嵌套的时候,一定要注意会不会越界,溢出等等
③for循环时,stack.size()再pop之后会改变,而且没有clear函数,所以一定要先把size存起来

#include<bits/stdc++.h>
using namespace std;
int n, postorder[41], inorder[41];
struct node {
    int v;
    node* left = NULL, * right = NULL;
    int level = 0;
}*root;
vector<node*> v;
void creat_tree(node*& root, int inL, int inR, int postL, int postR) {
    if (inL > inR)
        return;
    if (root == NULL) {
        root = new node;
        root->v = postorder[postR];
    }
    int k;
    for (k = inL; k <= inR; k++) {
        if (inorder[k] == postorder[postR])
            break;
    }
    int leftlen = k - inL;
    creat_tree(root->left, inL, k - 1, postL, postL + leftlen - 1);
    creat_tree(root->right, k + 1, inR, postL + leftlen, postR - 1);
}
void getlevel(node* root, int lev) {
    if (root == NULL)
        return;
    root->level = lev;
    getlevel(root->left, lev + 1);
    getlevel(root->right, lev + 1);
}
void bfs(node* root) {
    queue<node*> q;
    q.push(root);
    int l = 0;
    while (!q.empty()) {
        node* temp = q.front();
        v.push_back(temp);
        q.pop();
        if (temp->left != NULL)
            q.push(temp->left);
        if (temp->right != NULL)
            q.push(temp->right);
    }
}
int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> inorder[i];
    }
    for (int i = 0; i < n; i++) {
        cin >> postorder[i];
    }
    creat_tree(root, 0, n - 1, 0, n - 1);
    getlevel(root, 0);
    bfs(root);
    cout << v[0]->v;
    stack<int> s;
    int i = 1;
    while (i < v.size()) {
        if (v[i]->level % 2 == 0) {
            while (v[i]->level % 2 == 0) {
                s.push(v[i]->v);
                i++;
                if(i>=v.size())
                    break;
            }
            int size=s.size();
            for (int j = 0; j < size; j++) {
                int t = s.top();
                s.pop();
                cout << " " << t;
            }
        }
        if(i>=v.size()) break;
        while (v[i]->level % 2 != 0) {
          cout << " " << v[i]->v;
          i++;
          if(i>=v.size())
              break;
      }
    }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值