给定一颗抽象语法二叉树,要求输出其中序遍历序列node
使用静态数组nodes存储每个结点的信息,使用father数组记录全部结点的父亲结点,这样在遍历father的时候其值为0的就是根结点下标root。对于其中序遍历的输出,其特色是对于根结点没有左右括号,除此以外只要有孩子存在就必定有左右括号,单目运算必定在左边,而后就是双目运算和数字。ios
#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; }