diff --git a/GPLT/CPP/L2-011 玩转二叉树 (25 分).cpp b/GPLT/CPP/L2-011 玩转二叉树 (25 分).cpp new file mode 100644 index 0000000..5ba68a0 --- /dev/null +++ b/GPLT/CPP/L2-011 玩转二叉树 (25 分).cpp @@ -0,0 +1,40 @@ +#include +#include +using namespace std; + +vector InOrder, PreOrder, Level(10000, -1); +// 递归层次遍历 +void getLevel(int root, int start, int end, int index); + +int main(){ + int n, cnt = 0; + cin >> n; + InOrder.resize(n); + PreOrder.resize(n); + //Level.resize(n); + //vector InOrder(n), PreOrder(n), Level(n); + for(int i = 0; i < n; i++) + cin >> InOrder[i]; + for(int i = 0; i < n; i++) + cin >> PreOrder[i]; + getLevel(0, 0, n-1, 0); + for(int i = 0; i < Level.size(); i++){ + if(Level[i] != -1 && cnt != n - 1){ + cout << Level[i] << " "; + cnt++; + }else if(Level[i] != -1){ + cout << Level[i]; + break; + } + } + return 0; +} + +void getLevel(int root, int start, int end, int index){ + if(start > end) return ; + int i = start; + while(i < end && InOrder[i] != PreOrder[root]) i++; + Level[index] = PreOrder[root]; + getLevel(root + 1, start, i - 1, 2 * index + 2); + getLevel(root + 1 + i - start, i + 1, end, 2 * index + 1); +}