-
题目描述:
-
输入一个二叉树,输出其镜像。
-
输入:
-
输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000,n代表将要输入的二叉树节点的个数(节点从1开始编号)。接下来一行有n个数字,代表第i个二叉树节点的元素的值。接下来有n行,每行有一个字母Ci。
Ci=’d’表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号。
Ci=’l’表示第i个节点有一个左孩子,紧接着是左孩子的编号。
Ci=’r’表示第i个节点有一个右孩子,紧接着是右孩子的编号。
Ci=’z’表示第i个节点没有子孩子。
-
输出:
-
对应每个测试案例,
按照前序输出其孩子节点的元素值。
若为空输出NULL。
-
样例输入:
-
7 8 6 10 5 7 9 11 d 2 3 d 4 5 d 6 7 z z z z
-
样例输出:
-
8 10 11 9 6 7 5
推荐指数:※
来源:http://ac.jobdu.com/problem.php?pid=1521
递归
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<vector> using namespace std; typedef struct Tree{ int val; int left; int right; }Tree; typedef struct node{ int val; node* left; node* right; }node; vector<Tree> tree; node * mirror_tree(int n){ if(n!=-1){ node *t=new node; t->val=tree[n].val; t->left=mirror_tree(tree[n].right); t->right=mirror_tree(tree[n].left); return t; } else return NULL; } void print_pre_tree(node * root){ if(root!=NULL){ printf(" %d",root->val); print_pre_tree(root->left); print_pre_tree(root->right); } } int main() { int n,i; while(scanf("%d",&n)!=EOF){ tree.resize(n+1); for(i=1;i<=n;i++){ scanf("%d",&tree[i].val); } for(i=1;i<=n;i++){ char child[2]; scanf("%s",child); if(child[0]=='d'){ scanf("%d",&tree[i].left); scanf("%d",&tree[i].right); } else if(child[0]=='l'){ scanf("%d",&tree[i].left); tree[i].right=-1; } else if(child[0]=='r'){ scanf("%d",&tree[i].right); tree[i].left=-1; } else { tree[i].left=-1; tree[i].right=-1; } } if(n>0){ node *t=mirror_tree(1); printf("%d",t->val); print_pre_tree(t->left); print_pre_tree(t->right); printf("\n"); }else printf("NULL\n"); } return 0; }