题目粗心
给定一颗形象语法二叉树,要求输入其中序遍历序列
算法思路
应用动态数组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;}