题目
在某个存储介质以如下形式保存一棵二叉树
1(2(3,4(,5)),6(7,))
上述序列表示的二叉树如下
观察后可以发现,每个节点的格式为
X
,X
可以为空
或者
X(Y, Z)
,其中X
不为空
请编写程序将以上述格式输入的二叉树输出为中序遍历顺序
输入
上述格式表示的二叉树字符串,用字符1~9表示每个二叉树的每个节点,字符可以重复使用
输出
二叉树的中序遍历结果
样例输入
1(2(3,4(,5)),6(7,))
样例输出
3245176
代码
思路:先写出二叉树结点定义,接着用栈实现建立二叉树,再对已建立好的二叉树进行中序遍历。
#include <iostream>
#include <vector>
#include <numeric>
#include <limits>
#include <string>
#include <stack>
using namespace std;
/*请完成下面这个函数,实现题目要求的功能
当然,你也可以不按照下面这个模板来作答,完全按照自己的想法来 ^-^
******************************开始写代码******************************/
//定义二叉树结点
typedef struct TreeNode {
char val;
TreeNode* left;
TreeNode* right;
TreeNode() : val(0), left(NULL), right(NULL) {}
}TreeNode;
void Traversal(TreeNode* cur, string& res) {
if (cur != NULL) {
Traversal(cur->left, res);
res += cur->val;
Traversal(cur->right, res);
}
}
string solution(string input) {
//先将输入构造成一棵二叉树
stack<TreeNode*> st;
string result;
vector<int> pos; //记录原字符串添加0的位置
for (int i = 0; i < input.size(); i++) {
if (input[i] == '(' && input[i + 1] == ',') {
pos.push_back(i+1);
}
else if (input[i] == ',' && input[i + 1] == ')') {
pos.push_back(i+1);
}
}
for (int i = 0; i < pos.size(); i++) {
input.insert(pos[i] + i, "0");
}
//将添0后的字符串构造成二叉树 1(2(3,4(0,5)),6(7,0))
for (int j = 0; j < input.size(); j++) {
if (input[j] >= '0' && input[j] <= '9') { //是数字就压栈
TreeNode* node = new TreeNode();
node->val = input[j];
st.push(node);
}
else if (input[j] == ')') { //遇到右括号,就将其前面压栈的两个结点弹出
TreeNode* right = st.top();
st.pop();
TreeNode* left = st.top();
st.pop();
st.top()->left = left->val == '0' ? NULL : left; //结点中值为0不能添加,左孩子应当为空指针
st.top()->right = right->val == '0' ? NULL : right;
}
}
//中序遍历
Traversal(st.top(), result);
return result;
}
/******************************结束写代码******************************/
int main() {
string res;
string _input; // 1(2(3,4(,5)),6(7,))
getline(cin, _input);
res = solution(_input);
cout << res << endl;
return 0;
}