2022.1.28 练习 PAT甲 1102 Invert a Binary Tree(原题链接)
反转二叉树:进行后序遍历,在后序遍历访问根节点时交换左孩子和右孩子。
题解如下(使用静态树):
#include <bits/stdc++.h>
using namespace std;
int n;
struct node
{
int data;
int lchild;
int rchild;
int flag;
}Node[12];
vector<int> in;
vector<int> level;
void inorder(int root)
{
if(root==-1)
return ;
inorder(Node[root].lchild);
in.push_back(Node[root].data);
inorder(Node[root].rchild);
}
void layerorder(int root)
{
queue<int> q;
q.push(root);
while(!q.empty())
{
int now=q.front();
q.pop();
level.push_back(Node[now].data);
if(Node[now].lchild!=-1)
q.push(Node[now].lchild);
if(Node[now].rchild!=-1)
q.push(Node[now].rchild);
}
}
void postorder(int root)
{
if(root==-1)
return ;
postorder(Node[root].lchild);
postorder(Node[root].rchild);
swap(Node[root].lchild,Node[root].rchild);
}
int main()
{
std::ios::sync_with_stdio(false);
cin>>n;
for(int i=0;i<n;i++)
{
Node[i].flag=-1;
Node[i].data=i;
}
for(int i=0;i<n;i++)
{
string s1,s2;
cin>>s1>>s2;
if(s1=="-")
{
Node[i].lchild=-1;
}
else
{
int tmp=atoi(s1.c_str());
Node[tmp].flag=0;
Node[i].lchild=tmp;
}
if(s2=="-")
{
Node[i].rchild=-1;
}
else
{
int tmp=atoi(s2.c_str());
Node[tmp].flag=0;
Node[i].rchild=tmp;
}
}
int root=0;
for(;root<n;root++)
{
if(Node[root].flag==-1)
break;
}
postorder(root);
inorder(root);
layerorder(root);
for(vector<int>::iterator it=level.begin();it!=level.end();it++)
{
cout<<*it;
if(it<level.end()-1)
cout<<" ";
}
cout<<endl;
for(vector<int>::iterator it=in.begin();it!=in.end();it++)
{
cout<<*it;
if(it<in.end()-1)
cout<<" ";
}
return 0;
}