题意
题目给出一棵二叉树每个结点的孩子结点的情况,并且要求反转二叉树,输出其层序序列以及中序序列
注意点
- 存取字符矩阵的时候直接将其反转存入
- 字符之间空格和回车的吸收
题解
解题思路:
①定义静态二叉树或者普通二叉树,及新建其结点的函数
②用二维字符数组存入题目提供的每个结点的孩子情况,此时就可以反转
③没有出现的数字就是根结点,因为根结点不是任何结点的孩子
④从根节点开始用create函数创建一棵二叉树
⑤分别用层次遍历和中序遍历遍历该二叉树,输出各个结点的权值
静态二叉树实现:
#include <stdio.h>
#include <queue>
using namespace std;
const int maxn = 15;
struct node {
int data;
int lchild, rchild;
}Node[15];
//新建结点
int index = 0;
int newNode(int v) {
Node[index].data = v;
Node[index].lchild = -1;
Node[index].rchild = -1;
return index++;
}
//全局变量
int n, hash2[maxn] = {0};
char tree[15][2];
//根据结点情况创建二叉树
void create(int root) {
if (tree[Node[root].data][0] == '-' && tree[Node[root].data][1] == '-') {
return;
}
if (tree[Node[root].data][0] == '-') {
Node[root].lchild = -1;
} else {
Node[root].lchild = newNode(tree[Node[root].data][0] - '0');
create(Node[root].lchild);
}
if (tree[Node[root].data][1] == '-') {
Node[root].rchild = -1;
} else {
Node[root].rchild = newNode(tree[Node[root].data][1] - '0');
create(Node[root].rchild);
}
}
bool flag = false;
//层序遍历
void layerOrder(int &root) {
if (root == -1) {
return;
}
queue<int> q;
q.push(root);
while (!q.empty()) {
int now = q.front();
q.pop();
if (flag) printf(" ");
printf("%d", Node[now].data);
flag = true;
if (Node[now].lchild != -1) q.push(Node[now].lchild);
if (Node[now].rchild != -1) q.push(Node[now].rchild);
}
}
//中序遍历
bool flag2 = false;
void inorder(int root) {
if (root == -1) {
return;
}
inorder(Node[root].lchild);
if (flag2) printf(" ");
printf("%d", Node[root].data);
flag2 = true;
inorder(Node[root].rchild);
}
int main() {
scanf("%d", &n);
getchar();
for (int i = 0; i < n; i++) {
for (int j = 0; j < 2; j++) {
char c;
scanf("%c", &c);
getchar();
tree[i][1-j] = c;
if (c >= '0' && c <= '9') {
hash2[c-'0'] = 1;
}
}
}
//确定根结点
int root;
for (int i = 0; i < n; i++) {
if (hash2[i] == 0) {
root = newNode(i);
break;
}
}
//以根结点创建二叉树
create(root);
//层序遍历输出结点权值
layerOrder(root);
printf("\n");
//中序遍历输出结点权值
inorder(root);
printf("\n");
return 0;
}