給定一顆抽象語法二叉樹,要求輸出其中序遍歷序列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; }