题目
思路 递归
如果root为空,就返回空字符串;如果root左右节点都是空的,就返回根节点字符串;如果root右节点是空的,就返回根节点和递归左子树的结果;如果左右节点都不为空,就返回根节点和递归左子树和递归右子树的结果。
代码
class Solution {
public:
string tree2str(TreeNode* root) {
if(root == nullptr)
return "";
else if(root -> left == nullptr && root -> right == nullptr)
return to_string(root -> val);
else if(root -> right == nullptr)
return to_string(root -> val) + "(" + tree2str(root -> left) + ")";
return to_string(root -> val) + "(" + tree2str(root -> left) + ")(" + tree2str(root -> right) + ")";
}
};
思路 迭代
使用一个栈模拟迭代的顺序,使用一个哈希集合标志是否访问过节点。先把根节点放入栈中。如果栈不为空,就继续循环。获取栈顶结点,如果该结点访问过,并且不是根节点,就添加")",并弹出。如果该结点没访问过,就设置为访问,并在结果中添加这个结点的数据。如果这个结点左指针为空,右指针不为空,就添加()。如果右指针和左指针不为空,就入栈。
代码
class Solution {
public:
string tree2str(TreeNode* root) {
string ans;
stack<TreeNode*> s;
unordered_set<TreeNode*> vis;
s.push(root);
while(!s.empty()){
auto cur = s.top();
if(vis.count(cur)){
if(cur != root){
ans += ")";
}
s.pop();
}else{
vis.insert(cur);
if(cur != root){
ans += "(";
}
ans += to_string(cur -> val);
if(cur -> left == nullptr && cur -> right != nullptr){
ans += "()";
}
if(cur -> right != nullptr) s.push(cur -> right);
if(cur -> left != nullptr) s.push(cur -> left);
}
}
return ans;
}
};