#include<bits/stdc++.h>
using namespace std;
const int MAXN = 50;
struct node {
node* left;
node* right;
int data;
};
vector<int> level;
int in[MAXN];
int n;
node* create(vector<int> level,int inl,int inr) {
if (level.size() == 0) {
return NULL;
}
node* root = new node;
root -> data = level[0];
int k;
for(int i = inl;i <= inr;i++) {
if (in[i] == level[0]) {
k = i;
break;
}
}
vector<int> levelLeft;
vector<int> levelRight;
// 要从根节点之外的结点开始遍历
for(int i = 1;i < level.size();i++) {
bool isLeft = false;
for(int j = inl;j < k;j++) {
if (level[i] == in[j]) {
isLeft = true;
break;
}
}
if (isLeft) {
levelLeft.emplace_back(level[i]);
} else {
levelRight.emplace_back(level[i]);
}
}
root -> left = create(levelLeft,inl,k - 1);
root -> right = create(levelRight,k + 1,inr);
return root;
}
// node* create(vector<int> level,int inl,int inr) {
// if (level.size() == 0) { // 当层序中的数字被使用完以后 说明此时已经遍历到了一边的最深处了
// return NULL;
// }
// node* root = new node;
// root -> data = level[0];
// int k;
// for(int i = inl;i <= inr;i++) {
// if (in[i] == level[0]) {
// k = i;
// break;
// }
// }
// vector<int> levelLeft;
// vector<int> levelRight;
// for(int i = 1;i < level.size();i++) {
// bool isleft = false;
// for(int j = inl;j < k;j++) { // 在左子树中遍历 找到属于左子树的部分
// if (level[i] == in[j]) {
// isleft = true;
// break;
// }
// }
// if (isleft) {
// levelLeft.emplace_back(level[i]);
// } else {
// levelRight.emplace_back(level[i]);
// }
// }
// root -> left = create(levelLeft,inl,k - 1);
// root -> right = create(levelRight,k + 1,inr);
// return root;
// }
void preOrder(node* root) {
vector<int> res;
stack<node*> s;;
s.push(root);
while(!s.empty()) {
node* u = s.top();
s.pop();
res.emplace_back(u -> data);
if (u -> right) {
s.push(u -> right);
}
if (u -> left) {
s.push(u -> left);
}
}
for(int i = 0;i < res.size();i++) {
cout<<res[i]<<" ";
}
cout<<endl;
}
int main(void) {
freopen("pataTrain//in.txt","r",stdin);
cin>>n;
// level的大小要严格控制
level.resize(n);
for(int i = 0;i < n;i++) {
cin>>level[i];
}
for(int i = 0;i < n;i++) {
cin>>in[i];
}
node* root = new node;
root = create(level,0,n - 1);
preOrder(root);
return 0;
}
根据二叉树的中序和层序遍历还原二叉树(PAT尚未考过)
最新推荐文章于 2022-10-02 17:18:58 发布