题意:给你N个结点,然后输入N行,每行代表当前第i个结点,每个结点有左右孩子,然后将其反转后,进行层序遍历和中序遍历,层序遍历相当于BFS,中序相当于DFS.下面给出两种做法,第二种是纯数据结构做法,参考大神的,第一种相对比较好理解一些。
#include <iostream>
#include <string>
#include <cstring>
#include<algorithm>
#include<cmath>
#include <vector>
#include <map>
#include<stack>
#include<queue>
#include <stdio.h>
using namespace std;
#define MAX 500+5
#define INF 0x3f3f3f3f
struct BTree {
int lchild, rchild;
int val;
}t[MAX];
int n;
void reverse(int root) {
for (int i = 0; i < n; i++) {
int temp = t[i].lchild;
t[i].lchild = t[i].rchild;
t[i].rchild = temp;
}
}
void level_order(int root) {
int count = 0;
queue<int>q;
q.push(root);
while (!q.empty()) {
int p = q.front();
q.pop();
count++;
printf("%d", p);
if (count<n) printf(" ");
else printf("\n");
if (t[p].lchild != -1) q.push(t[p].lchild);
if (t[p].rchild != -1) q.push(t[p].rchild);
}
}
void in_order(int root) {
static int count = 0;
if (root == -1)
return;
in_order(t[root].lchild);
printf("%d", root);
count++;
if (count<n) printf(" ");
in_order(t[root].rchild);
}
int main() {
int i, root = -1;
int node[15];
char c1, c2;
scanf("%d", &n);
getchar();
memset(node, 0, sizeof(node));
for (i = 0; i < n; i++) {
cin >> c1 >> c2;
if (c1 >= '0'&&c1 <= '9') {
t[i].lchild = c1 - '0';
node[c1-'0'] = 1;
}
else {
t[i].lchild = -1;
}
if (c2 >= '0'&&c2 <= '9') {
t[i].rchild = c2 - '0';
node[c2-'0'] = 1;
}
else {
t[i].rchild = -1;
}
}
for (i = 0; i < n; i++) {
if (node[i] == 0) {
root = i;
break;
}
}
reverse(root);
level_order(root);
in_order(root);
return 0;
}
#include <iostream>
#include <string>
#include <cstring>
#include<algorithm>
#include<cmath>
#include <vector>
#include <map>
#include<stack>
#include<queue>
#include <stdio.h>
using namespace std;
#define MAX 500+5
#define INF 0x3f3f3f3f
struct BTree {
BTree *ld, *rd;
int val;
}t[MAX];
vector<int> level;
vector<int> in;
void level_order(BTree *root) {
queue<BTree *> Q;
Q.push(root);
while (!Q.empty()) {
BTree *node = Q.front();
Q.pop();
if (node != NULL) {
level.push_back(node->val);
Q.push(node->ld);
Q.push(node->rd);
}
}
}
void in_order(BTree *node) {
if (node != NULL) {
in_order(node->ld);
in.push_back(node->val);
in_order(node->rd);
}
}
int main() {
int n, i, root = -1;
int node[15];
char c1, c2;
scanf("%d", &n);
getchar();
memset(node, 0, sizeof(node));
for (i = 0; i < n; i++) {
scanf("%c %c", &c1, &c2);
getchar();
t[i].val = i;
if (c1 >= '0'&&c1 <= '9') {
node[c1 - '0'] = 1;
t[i].rd = &(t[c1 - '0']);
}
else {
t[i].rd = NULL;
}
if (c2 >= '0' && c2 <= '9') {
node[c2 - '0'] = 1;
t[i].ld = &(t[c2 - '0']);
}
else {
t[i].ld = NULL;
}
}
for (i = 0; i < n; i++) {
if (node[i] == 0) {
root = i;
break;
}
}
level_order(&(t[root]));
in_order(&(t[root]));
for (int i = 0; i < level.size(); ++i)
{
if (i == 0) {
cout << level[i];
}
else {
cout << " " << level[i];
}
}
cout << endl;
for (int i = 0; i < in.size(); ++i)
{
if (i == 0) {
cout << in[i];
}
else {
cout << " " << in[i];
}
}
cout << endl;
return 0;
}