通过寻找根节点的下标来划分左右子树,递归打印
#include <iostream>
#include <string>
using namespace std;
struct Node {
string data;
int leftChildIndex, rightChildIndex;
};
struct Node *nodes;
int rootIndex(bool *index, int n) {
for (int i = 1; i <= n; i++) {
if (index[i] == false) {
return i;
}
}
return -1;
}
void printTree(int rootIndex) {
int left = nodes[rootIndex].leftChildIndex;
if (left != -1) {
if (nodes[left].leftChildIndex != -1) printf("(");
printTree(nodes[rootIndex].leftChildIndex);
if (nodes[left].leftChildIndex != -1) printf(")");
}
cout << nodes[rootIndex].data;
int right = nodes[rootIndex].rightChildIndex;
if (right != -1) {
if (nodes[right].rightChildIndex != -1) printf("(");
printTree(nodes[rootIndex].rightChildIndex);
if (nodes[right].rightChildIndex != -1) printf(")");
}
}
int main() {
int n = 0;
cin >> n;
nodes = new struct Node[n + 1];
bool *index = new bool[n + 1];
for (int i = 1; i <= n; i++) {
cin >> nodes[i].data >> nodes[i].leftChildIndex >> nodes[i].rightChildIndex;
if (nodes[i].leftChildIndex != -1) index[nodes[i].leftChildIndex] = true;
if (nodes[i].rightChildIndex != -1) index[nodes[i].rightChildIndex] = true;
}
int root = rootIndex(index, n);
if (root == -1) {
cout << "error";
} else {
printTree(root);
}
delete [] index;
delete [] nodes;
return 0;
}