解法
- 使用静态链表构建二叉树
- 用IsVisited数组保存所有的非根节点,遍历该数组就可得到根节点
- 写层序遍历函数,只是先检查右子树,再检查左子树
- 写中序遍历函数,也是先递归右子树,再递归左子树
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int N;
struct Node{
int left,right;
}A[11];
bool IsVisited[11];
vector<int> level;
vector<int> inorder;
void Print_Level(int root){
if(root == -1)
return;
queue<int> q;
q.emplace(root);
while(!q.empty()){
int t = q.front();
q.pop();
level.emplace_back(t);
if(A[t].right != -1)
q.emplace(A[t].right);
if(A[t].left != -1)
q.emplace(A[t].left);
}
}
void Print_Inorder(int root){
if(root == -1)
return;
Print_Inorder(A[root].right);
inorder.emplace_back(root);
Print_Inorder(A[root].left);
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
for(int i = 0;i < 11;i++){
A[i].left = A[i].right = 0;
IsVisited[i] = false;
}
scanf("%d\n",&N);
char l,r;
for(int i = 0;i < N;i++){
scanf("%c %c\n",&l,&r);
if(l >= '0' && l <= '9'){
A[i].left = l - '0';
IsVisited[l - '0'] = true;
}
else
A[i].left = -1;
if(r >= '0' && r <= '9'){
A[i].right = r - '0';
IsVisited[r - '0'] = true;
}
else
A[i].right = -1;
}
int root = -1;
for(int i = 0;i < N;i++)
if(IsVisited[i] == false)
root = i;
Print_Level(root);
Print_Inorder(root);
for(int i = 0;i < level.size();i++)
if(i == 0) cout << level[0];
else cout << " " << level[i];
cout << endl;
for(int i = 0;i < inorder.size();i++)
if(i == 0) cout << inorder[0];
else cout << " " << inorder[i];
return 0;
}