题目粗心
给定一颗形象语法二叉树,要求输入其中序遍历序列
算法思路
应用动态数组nodes存储每一个结点的信息,应用father数组记录所有结点的父亲结点,这样在遍历father的时候其值为0的就是根结点下标root。对于其中序遍历的输入,其特点是对于根结点没有左右括号,除此之外只有有孩子存在就肯定有左右括号,单目运算肯定在右边,而后就是双目运算和数字。
提交后果
AC代码
#include <cstdio>
#include <algorithm>
#include <string>
#include <iostream>
#include <cstring>
using namespace std;
struct Node{
string data;
int left{};
int right{};
}nodes[25];
int root = 0;
void inOrder(int r){
if(r==-1){
return;
}
if(r!=root&&(nodes[r].left!=-1||nodes[r].right!=-1)){
// 根节点没有左右括号,只有有孩子,就有左括号
printf("(");
}
inOrder(nodes[r].left);
cout<<nodes[r].data;
inOrder(nodes[r].right);
if(r!=root&&(nodes[r].left!=-1||nodes[r].right!=-1)){
// 根节点没有左右括号,只有有孩子,就有右括号
printf(")");
}
}
int main() {
int n;
scanf("%d",&n);
int father[n+1];
memset(father,0,sizeof(father));
for(int i=1;i<=n;++i){
cin>>nodes[i].data>>nodes[i].left>>nodes[i].right;
father[nodes[i].left] = i;
father[nodes[i].right] = i;
}
for(int i=1;i<=n;++i){
if(father[i]==0){
root = i;
break;
}
}
inOrder(root);
return 0;
}
发表回复