1. 程式人生 > 實用技巧 >P1030 求先序排列

P1030 求先序排列

題目大意:

給定一棵二叉樹的中序和後序遍歷,求先序遍歷。
例如中序遍歷\(ACGDBHZKX\),後序遍歷為\(CDGAHXKZB\),那麼先序遍歷就是\(BAGCDZHKX\)

思路:

首先我們知道二叉樹的先序遍歷是先訪問根再訪問子樹,那麼對於這道題來說要求先序遍歷結果,我們就每次執行函式輸出當前子樹它的根即可,那麼問題來了:

1.根怎麼求?

根就是後序遍歷的最後一個結點,例如\(CDGAHXKZB\),則這顆二叉樹的根就是\(B\)

2.左右子樹怎麼表示呢?

我們已經找到了根為\(B\),用\(find\)函式找到\(B\)的位置,根據中序遍歷是先訪問左(右)子樹在訪問根,然後再訪問右(左)子樹

,可知根就把一顆樹分為了左右子樹,那麼就明白了,對於\(ACGDBHZKX\),左子樹就就是\(ACGD\),右子樹是\(HZKX\),然後再找後序遍歷\(CDGA\)\(HXKZ\)
因此剩下的我們只需要遞迴執行同樣的過程就可了。
PS:想出這個思路的人一定是個巨佬

程式碼

#include <iostream>
#include <string>

using namespace std;
//後序遍歷找根 中序遍歷找根分為兩棵子樹
void res(string in, string after)
{
    if(in.size() > 0)
    {
        char ch = after[after.size()-1];//找到根並輸出
        cout << ch;
        int k = in.find(ch); //4
        res(in.substr(0, k), after.substr(0, k)); //中序遍歷左 後序遍歷左
        res(in.substr(k+1), after.substr(k, in.size()-k-1)); //中序遍歷右 後序遍歷右 
    }
}

int main()
{
    string in, after;
    cin >> in;
    cin >> after;
    res(in, after);
    return 0;
}