题解
其实这道题是二叉树的反序列化,很经典。
版本2
#include <iostream>
#include <vector>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>
#include <cstdio>
using namespace std;
struct tree{
char val;
tree *left, *right;
tree(char x){
val = x;
left = right = nullptr;
}
};
tree* preorder(string &str, int &u){
if(str[u] == '#'){
u++; //这里也需要往下移动一格
return nullptr;
}
auto root = new tree(str[u]);
u++; //先序遍历 先插入内容 然后到子树去查看
root->left = preorder(str, u);
root->right = preorder(str, u);
return root;
}
void inorder(tree* root){
if(!root) return;
inorder(root->left);
cout<<root->val<<" ";
inorder(root->right);
}
int main(){
string str;
while(cin>>str){
int u = 0;
tree* root = preorder(str, u);
inorder(root);
cout<<endl;
}
return 0;
}
版本1
#include<cstdio>
using namespace std;
int i;
char str[105];
struct node{
char data;
node* lchild;
node* rchild;
};
node* preCreate(){
if(str[i] == '#'){
i++;
return NULL;
}else{
node* root = new node;
root->data = str[i];
i++;
root->lchild = preCreate();
root->rchild = preCreate();
return root;
}
}
void inorder(node* root){
if(root == NULL) return;
inorder(root->lchild);
printf("%c ",root->data);
inorder(root->rchild);
}
int main(){
while(scanf("%s",str) != EOF){
node* root = NULL;
i=0;
root = preCreate();
inorder(root);
printf("\n");
}
return 0;
}