真的笨死了 看了別人的代碼真的太妙了
在草稿紙上很容易發現中序就是那些關鍵字的順序
但是怎麼添括號 一開始想的是對結果處理
但是太麻煩了 想了下可能應該是可以在中序的過程中就把這個過程搞定 但是一直想不出來 搜了下別人的代碼發現有個人想法和我一樣但是他真的做出來了而且果然很簡潔
括號的輸出應該是在運行到運算符節點的時候輸出
比如輸出個( 然後代碼就繼續往左下角跑 跑完回來這個運算符節點 又往右下角跑 跑完回來 就可以輸出)了
這裏有一個負號的問題 其實自己想複雜了
這裏面還有一些很妙的地方但是說不出來 就是比如只判斷右子樹 只要右子樹不是空的 就應該給他包起來
如果是運算符的意思的話肯定左子樹是數字 不用判斷左子樹 右子數肯定有東西
如果是負號的意思的話 左子樹沒有 右子樹肯定有數字或者運算結果
#include <cstdio>
#include <iostream>
using namespace std;
struct Node{
string data;
int left;
int right;
}node[30];
int n;
bool notRoot[30]={false};
int k=0;
void inorder(int root,int layer)
{
if(root!=-1)
{
if(node[root].right!=-1&&layer>0) printf("(");
inorder(node[root].left,layer+1);
cout<<node[root].data;
inorder(node[root].right,layer+1);
if(node[root].right!=-1&&layer>0) printf(")");
}
}
int main()
{
scanf("%d",&n);
int lchild,rchild;
for(int i=1;i<=n;i++)
{
cin>>node[i].data>>lchild>>rchild;
node[i].left = lchild;
node[i].right = rchild;
if(lchild!=-1)
notRoot[lchild]=true;
if(rchild!=-1)
notRoot[rchild]=true;
}
int root;
for(int i=1;i<=n;i++)
{
if(!notRoot[i])
{
root = i;
break;
}
}
inorder(root,0);
return 0;
}