tips:
1167 Cartesian Tree 与 1020 Tree Traversals 属于同一类型的题目,做法大致相同,建议一起做。
赋上1020我的做法
解法:
#include <iostream>
#include <vector>
using namespace std;
int inorder[30];// 中序遍历的序列
std::vector<int> level[30];// 数组的每一个元素都是一个容器,容器内装着树上一层的元素
const int MAXINT=0x7fffffff;
void dfs(int left,int right,int currentLevel){
if(left>right) return;
// 找到子树中最小的元素,就是currentLevel这一层的元素
int minIndex=-1,min=MAXINT;
for(int i=left;i<=right;i++){
if(inorder[i]<=min){
min=inorder[i];
minIndex=i;
}
}
level[currentLevel].push_back(min);
// 以同样的方式处理当前子树的左右子树
dfs(left,minIndex-1, currentLevel+1);
dfs(minIndex+1,right, currentLevel+1);
}
int main(int argc, char** argv) {
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>inorder[i];
}
dfs(0,n-1, 0);
cout<<level[0][0];
for(int i=1;i<30;i++){
for(int j=0;j<level[i].size();j++)
cout<<" "<<level[i][j];
}
return 0;
}