玩轉二叉樹(樹的遍歷)

貓的玖月發表於2020-11-04

給定一棵二叉樹的中序遍歷和前序遍歷,請你先將樹做個鏡面反轉,再輸出反轉後的層序遍歷的序列。所謂鏡面反轉,是指將所有非葉結點的左右孩子對換。這裡假設鍵值都是互不相等的正整數。

輸入格式:
輸入第一行給出一個正整數N(≤30),是二叉樹中結點的個數。第二行給出其中序遍歷序列。第三行給出其前序遍歷序列。數字間以空格分隔。

輸出格式:
在一行中輸出該樹反轉後的層序遍歷的序列。數字間以1個空格分隔,行首尾不得有多餘空格。

輸入樣例:
7
1 2 3 4 5 6 7
4 1 3 2 6 5 7
輸出樣例:
4 6 1 7 5 3 2

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 100;
struct node{
    int data;
    node* lchild;
    node* rchild;
};

int pre[maxn], in[maxn], post[maxn];
int n;

node* creat(int preL, int preR, int inL, int inR){
    if(preL > preR) return NULL;
    node* root = new node;
    root->data = pre[preL];
    int k;
    for(k = inL; k <= inR; k++){
        if(in[k] == pre[preL]) break;
    }
    int numLeft = k-inL;
    root->rchild = creat(preL+1, preL+numLeft, inL, k-1);
    root->lchild = creat(preL+numLeft+1, preR, k+1, inR);
    return root;
}
int num = 0;
void BFS(node* root){
    queue<node*> q;
    q.push(root);
    while(!q.empty()){
        node* now = q.front();
        q.pop();
        cout <<now->data;
        num++;
        if(num < n) cout << ' ';
        if(now->lchild != NULL) q.push(now->lchild);
        if(now->rchild != NULL) q.push(now->rchild);
    }
}

int main(){
    //ios::sync_with_stdio(false);
    cin >> n;

    for(int i = 0; i < n; i++){
        cin >> in[i];
    }
    for(int i = 0; i < n; i++){
        cin >> pre[i];
    }
    node* root = creat(0, n-1, 0, n-1);
    BFS(root);

    return 0;
}

反思
喵的!!!!我發現自己真的好懶呀!!!!只是Ctrl +C 和Ctrl+V, 啥時候才能掌握寫法呀!!!, 你他喵的快給我去自己揹著打一遍去!快點滴!!!

相關文章