一、题目概述
对二叉树反转并输出层序、中序遍历序列。
二、思路
方法很多,可以建树时反转左右子树,也可以遍历时交换访问左右子树顺序。
注意:
1、正确读入换行符;
2、寻找根节点:即不为任何结点的子树的结点。
三、代码
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
void inorder(int v, vector<int> &seq, vector<int> &lchild, vector<int> &rchild)
{
if(v != -1)
{
inorder(lchild[v], seq, lchild, rchild);
seq.push_back(v);
inorder(rchild[v], seq, lchild, rchild);
}
}
int main()
{
int N, root, v;
scanf("%d\n", &N);
vector<int> lchild(N), rchild(N), isroot(N, 1), inseq;
for(int i = 0; i < N; ++i)
{
char c1, c2;
scanf("%c %c\n", &c1, &c2);
rchild[i] = c1 == '-' ? -1:c1 - '0';
lchild[i] = c2 == '-' ? -1:c2 - '0';
if(c1 != '-')
isroot[c1 - '0'] = 0;
if(c2 != '-')
isroot[c2 - '0'] = 0;
}
for(root = 0; !isroot[root]; ++root);
queue<int> q;
q.push(root);
while(!q.empty())
{
v = q.front();
q.pop();
if(v != -1)
{
printf("%s%d", v == root ? "":" ", v);
q.push(lchild[v]);
q.push(rchild[v]);
}
}
inorder(root, inseq, lchild, rchild);
for(int i = 0; i < inseq.size(); ++i)
printf("%s%d", i ? " ":"\n", inseq[i]);
}