PAT1102 树的翻转

来源:互联网 发布:php继承的原理 编辑:程序博客网 时间:2024/06/05 14:42


题意:  

将一颗树翻转。并求水平序列和中序序列。


翻转用递归求就行了。还有就是求根节点,根节点不是任何节点的孩子,通过这个可知哪个是根节点。

#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#include<stack>#include<vector>#include<queue>#include<string>#include<map>using namespace std;#define INF 99999999#define M 20int lc[M],rc[M],rflag[M];int root;int invert(int node){int lchild=lc[node];int rchild=rc[node];if(node==-1)return -1;invert(lc[node]);invert(rc[node]);lc[node]=rchild;rc[node]=lchild;return node;}void levelprint(){int node;vector<int> ans;queue<int> q;q.push(root);while(!q.empty()){node = q.front();q.pop();if(node==-1)continue;ans.push_back(node);q.push(lc[node]);q.push(rc[node]);}for(int i=0;i<ans.size();i++){cout<<ans[i];if(i<ans.size()-1)cout<<" ";else cout<<endl;}}int printn=0;void inprint(int node,int n){if(node==-1)return;inprint(lc[node],n);printf("%d",node);printn++;if(printn==n)cout<<endl;else cout<<" ";inprint(rc[node],n);}int main(){int n,i;char lchild,rchild;scanf("%d",&n);for(i=0;i<n;i++)rflag[i]=1;for(i=0;i<n;i++){getchar();scanf("%c %c",&lchild,&rchild);if(lchild!='-'){rflag[lchild-'0']=0;lc[i]=lchild-'0';}else lc[i]=-1;if(rchild!='-'){rflag[rchild-'0']=0;rc[i]=rchild-'0';}else rc[i]=-1;}for(i=0;i<n;i++)if(rflag[i]==1){root=i;break;}invert(root);levelprint();inprint(root,n);}



原创粉丝点击