刷题的速度太慢,一下午就写了一题,坑坑绊绊的。
- 对 C++ 语言掌握的不好
- 对问题的理解缺失不彻底
- 在写 code 的时候,思路不够清晰
我们从二叉树的根节点 root 开始进行深度优先搜索。
在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值。(如果节点的深度为 D,则其直接子节点的深度为 D + 1。根节点的深度为 0)。
如果节点只有一个子节点,那么保证该子节点为左子节点。
给出遍历输出 S,还原树并返回其根节点 root。
示例 1:
输入:"1-2--3--4-5--6--7"
输出:[1,2,5,3,4,6,7]
示例 2:
输入:"1-2--3---4-5--6---7"
输出:[1,2,5,3,null,6,null,4,null,7]
示例 3:
输入:"1-401--349---90--88"
输出:[1,401,null,349,88,90]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/recover-a-tree-from-preorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
【缺少原图】
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
string s;
int idx;
void bulitTree(TreeNode** p, int deep) {
int cur_deep = 0;
while(idx<s.size())
if(s[idx] == '-')
cur_deep++, idx++;
else
break;
if(cur_deep != deep) {
*p = NULL;
idx = idx - cur_deep;
return;
}
else {
string tmp = "";
while(idx < s.size())
if(s[idx]=='-')
break;
else
tmp += s[idx++];
(*p) = new TreeNode;
(*p)->val = atoi(tmp.c_str());
cout << (*p)->val << endl;
}
bulitTree(&((*p)->left), deep+1);
bulitTree(&((*p)->right), deep+1);
}
TreeNode* recoverFromPreorder(string S) {
s = S;
TreeNode* root;
bulitTree(&root, 0);
return root;
}
};
带着 deep 树的深度值 进行遍历,更多的工作还是用在了字符串 split。