基本思路都在代码注释里
#include <string>
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;
struct treeNode {
string data;
treeNode *leftChild{
};
treeNode *rightChild{
};
int leftTag;
int rightTag;
};
//返回的是中点逗号的位置
//1.当inputData为“C(D,E),F”时,返回“6”,
//2.当inputData为“C,D”时,返回“1”
//3.当inputData为“,A(B,C)”时,返回“0”
//4.当inputData为“C(D,E)”时,返回“-1”
int findMiddlePosition(string inputData) {
int result = -1;
int leftK = 0;
int rightK = 0;
int position = 0;
while (inputData[position]) {
if (inputData[position] == '(') {
++leftK;
} else if (inputData[position] == ')') {
++rightK;
} else if (leftK == rightK && inputData[position] == ',') {
result = position;
break;
}
++position;
}
return result;
}
//提取出数据
//1.当left为true时,提取的是左边的值
// 1.当inputData为“C(D,E),F”时,返回“C(D,E)”,
// 2.当inputData为“,A(B,C)”时,返回空字符串
// 3.当inputData为“C(D,E)”时,返回“C(D,E)”
//2.当left为false时,提取的是右边的值
// 1.当inputData为“C(D,E),F”时,返回“F”
// 2.当inputData为“C(D,E)”时,返回空字符串
string getString(const string &inputData, bool left) {
string result;
int middlePosition = findMiddlePosition(inputData);
if (left) {
if (middlePosition == -1) {
result = inputData;
} else if (middlePosition != 0) {
result = inputData.substr(0, middlePosition);
}
} else {
if (middlePosition != -1) {
result = inputData.substr(middlePosition + 1, inputData.length() - middlePosition - 1);
}
}
return result;
}
//对字符串进行处理
//inputData会有两种输入情况
// 1.输入的只是一个字符,此时直接返回空字符串
// 2.输入的是一个形如A(B(C,D),E)的形式,去掉第一,第二,最后一个字符,将返回B(C,D),E字符串
string eraseString(const string &inputData) {
string result;
if (inputData.length() != 1) {
result = inputData.substr(2, inputData.length() - 2 - 1);
}
return result;
}
//返回第一个字符
string getData(const string &inputData) {
return inputData.substr(0, 1);
}
//函数返回的是根节点
treeNode *buildTree(const string &inputData) {
auto *node = new treeNode;
node->data = getData(inputData);
string newInputData = eraseString(inputData);