玩轉二叉樹

xcdq發表於2020-11-07

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

輸入格式:
輸入第一行給出一個正整數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

解題

遍歷時先遍歷右子樹即可,見L2-011 玩轉二叉樹
程式碼實現見樹的遍歷
僅是將輸入和程式碼實現由後序、中序,變為中序、前續。
使用了小技巧,不建議使用

程式碼

#include <iostream>

using namespace std;
struct cheng {
    int num = 0;
    int all[20];
} cheng[30];

int findXian(int *qian, int *zhong, int n, int c) {
    if (n > 0) {
        int root = qian[0];
        int i;

        for (i = 0; i < n; ++i) {
            if (zhong[i] == root) {
                cheng[c].all[cheng[c].num] = root;
                cheng[c].num++;
                break;
            }
        }

        findXian(qian + i+1, zhong + i + 1, n-i-1, c + 1);//先右後左
        findXian(qian+1, zhong, i, c + 1);

    }
    return c;
}

int main() {
    int n;
    cin >> n;
    int qian[n], zhong[n];

    for (int i = 0; i < n; ++i) {
        cin >> zhong[i];
    }
    for (int i = 0; i < n; ++i) {
         cin >> qian[i];
    }
    findXian(qian, zhong, n, 0);

    int temp = 0;
    while (cheng[temp].num != 0) {
        for (int j = 0; j < cheng[temp].num; ++j) {
            if (temp != 0)cout << " " << cheng[temp].all[j];
            else cout << cheng[temp].all[j];
        }
        temp++;
    }

}

相關文章