【leetcode 968. 1028. 从先序遍历还原二叉树】解题报告[待完善...]
思路:用一个栈来管理树的层次关系,索引代表节点的深度
方法一:
TreeNode* recoverFromPreorder(string S) { /* 由题意知,最上层节点深度为0(数字前面0条横线),而第二层节点前有1条横线,表示深度为1 树的前序遍历: 根-左-右 因此, */ if (S.empty()) return nullptr; vector<TreeNode*> stack; // 结果栈 for(int i=0,depth=0,val=0;i<S.size();) { for(depth=0;i<S.size()&&S[i]=='-';++i) // 计算节点的深度 depth++; for(val=0;i<S.size()&&S[i]!='-';++i) // 计算数值 val=val*10+S[i]-'0'; while (stack.size()>depth) // 若当前栈的长度(树的高度)大于节点的深度,则可以把栈中最后几个节点pop掉(这些节点各已经成为完整的子树,可以pop掉了) stack.pop_back(); TreeNode* node=new TreeNode(val); // 新建节点用于存放当前深度的结点 if (!stack.empty()) // 节点间关联 { if (!stack.back()->left) stack.back()->left=node; else if(!stack.back()->right) stack.back()->right=node; } stack.push_back(node); } return stack[0]; }