Skip to content

M22275: 二叉搜索树的遍历

http://cs101.openjudge.cn/practice/22275/

思路:左子树所有节点值小于根节点,右子树所有节点值大于根节点。结合前序遍历,通过递归划分左右子树,最终得到后序遍历

cpp
#include <iostream>
#include <vector>
using namespace std;

vector<int> getPostorder(vector<int>& pre, int l, int r) {
    if (l > r) return {}; 
    int root = pre[l];   
    int mid = l + 1;
    while (mid <= r && pre[mid] < root) {
        mid++;
    }
 
    vector<int> left = getPostorder(pre, l + 1, mid - 1);
    vector<int> right = getPostorder(pre, mid, r);
    vector<int> res;
    res.insert(res.end(), left.begin(), left.end());
    res.insert(res.end(), right.begin(), right.end());
    res.push_back(root);
    return res;
}

int main() {
    int n;
    cin >> n;
    vector<int> pre(n);
    for (int i = 0; i < n; ++i) {
        cin >> pre[i];
    }
    vector<int> post = getPostorder(pre, 0, n - 1);
    for (size_t i = 0; i < post.size(); ++i) {
        if (i > 0) cout << " ";
        cout << post[i];
    }
    cout << endl;
    return 0;
}