题目粗心

给定一颗形象语法二叉树,要求输入其中序遍历序列

算法思路

应用动态数组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;}