PAT 甲级 1020 Tree Traversals
用中序遍历和后序遍历建立二叉树,然后输出层序遍历。
#include <bits/stdc++.h>
using namespace std;
const int N=40;
int post[N],in[N];
// lchild[i]=j means lchild of in[j] is in[j].
int root,lchild[N],rchild[N];
int Build(int l1,int r1,int l2,int r2)
{
if(l1>r1) return -1;
int root_val=post[r2],root;
for(root=0;root<=r1&&in[root]!=root_val;++root);
int left_num=root-l1;
lchild[root]=Build(l1,root-1,l2,l2+left_num-1);
rchild[root]=Build(root+1,r1,l2+left_num,r2-1);
return root;
}
void Bfs(int root)
{
queue<int> q;
q.push(root);bool first=true;
while(!q.empty()){
int now=q.front();
q.pop();
if(first) (cout<<in[now]),first=false;
else cout<<" "<<in[now];
if(lchild[now]!=-1) q.push(lchild[now]);
if(rchild[now]!=-1) q.push(rchild[now]);
}
}
int main() {
#ifdef LOCAL
//freopen("input.txt","r",stdin);
#endif
int n;cin>>n;
for(int i=0;i<n;++i) cin>>post[i];
for(int i=0;i<n;++i) cin>>in[i];
root=Build(0,n-1,0,n-1);
Bfs(root);
}
1086 Tree Traversals Again
用前序遍历和中序遍历重建二叉树,然后输出后序遍历。
#include <bits/stdc++.h>
using namespace std;
vector<int> in,pre;
stack<int> node;
// lchild[i]=j means lchild of node i is j.
int lchild[N],rchild[N];
void Read()
{
string op;int val;
while(cin>>op){
if(op=="Pop") in.push_back(node.top()),node.pop();
else{
cin>>val;
pre.push_back(val);
node.push(val);
}
}
}
int Build(int l1,int r1,int l2,int r2)
{
if(l1>r1) return 0;
int root=pre[l2], i;
for(i=l1;i<=r1&&in[i]!=root;++i);
int left_num=i-l1;
lchild[root]=Build(l1,i-1,l2+1,l2+left_num);
rchild[root]=Build(i+1,r1,l2+left_num+1,r2);
return root;
}
vector<int> ans;
void PostOrder(int root)
{
if(root==0) return;
PostOrder(lchild[root]);
PostOrder(rchild[root]);
ans.push_back(root);
}
int main() {
#ifdef LOCAL
//freopen("input.txt","r",stdin);
#endif
int n;cin>>n;
Read();
int root=Build(0,in.size()-1,0,pre.size()-1);
// cout<<"\n***************\n";
// for(int i=0;i<=n;++i) cout<<pre[i]<<" ";
// cout<<"\n***************\n";
PostOrder(root);
for(int i=0;i<n;++i){
if(i!=0) cout<<" ";
cout<<ans[i];
}
}
1102 Invert a Binary Tree
给出每个节点的子节点,建立二叉树,翻转后输出层序遍历和中序遍历。
#include <bits/stdc++.h>
using namespace std;
int lchild[20],rchild[20];
// to find the root node.
bool no_father[20];
vector<int> ans;
void LayerOrder(int root)
{
queue<int> q;
q.push(root);
while(!q.empty()){
int now=q.front();
q.pop();
ans.push_back(now);
if(lchild[now]!=-1) q.push(lchild[now]);
if(rchild[now]!=-1) q.push(rchild[now]);
}
}
void InOrder(int root)
{
if(root==-1) return;
InOrder(lchild[root]);
ans.push_back(root);
InOrder(rchild[root]);
}
void Print()
{
for(size_t i=0;i<ans.size();++i){
if(i!=0) cout<<" ";
cout<<ans[i];
}
cout<<endl;
}
int main() {
#ifdef LOCAL
//freopen("input.txt","r",stdin);
#endif
memset(no_father,true,sizeof(no_father));
int n;cin>>n;
for(int i=0;i<n;++i){
char l,r;cin>>l>>r;
if(l!='-') {lchild[i]=l-'0';no_father[l-'0']=0;}
else lchild[i]=-1;
if(r!='-') {rchild[i]=r-'0';no_father[r-'0']=0;}
else rchild[i]=-1;
}
// invert the binary tree.
swap(lchild,rchild);
// find the root.
int root;for(root=0;root<11&&!no_father[root];++root);
LayerOrder(root);Print();
ans=vector<int>();
InOrder(root);Print();
}