原题链接:https://leetcode-cn.com/problems/recover-a-tree-from-preorder-traversal/
迭代 + 栈
TreeNode* recoverFromPreorder(string S) {
// 存储当前节点的路径
stack<TreeNode*> path;
// 存储字符串中的位置
int pos = 0;
while (pos < S.size()) {
//获取当前层数
int level = 0;
while (S[pos] == '-') {
++level;
++pos;
}
//获取节点值
int value = 0;
while (pos < S.size() && isdigit(S[pos])) {
value = value * 10 + (S[pos] - '0');
++pos;
}
//构造当前节点
TreeNode* node = new TreeNode(value);
if (level == path.size()) {
//如果当前节点的深度等于当前路径长度(前一个节点是当前节点的父节点)
if(!path.empty()) {
//如果不是第一个节点,前一个节点的左子节点为当前节点
path.top()->left = node;
}
}
else {
//如果当前节点的深度不等于当前路径长度(前一个节点是当前节点的父节点)
while (level != path.size()) {
//通过queue弹出其他子节点,找到当前节点的父节点
path.pop();
}
//找到父节点,因为此时左子节点已确定,所以赋值给右子节点
path.top()->right = node;
}
//放入queue中
path.push(node);
}
//全部弹出,只剩根节点
while (path.size() > 1) {
path.pop();
}
//返回根
return path.top();
}