题目
给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。
空节点使用一对空括号对 “()” 表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。
分析
这里题目上明确要求了使用前序遍历的方式进行解题
这道题的主要难点在于如何正确的省略。
以左子树的遍历为例:
我们利用了"或"运算的特点:如果前面的一个条件为真,则进行第二个条件的判断
这里如果左子树不为空,则不判断右子树是否为空,直接写括号
这里如果左子树为空,则需要再判断右子树是否为空,如果右子树也为空,则直接跳过,如果右子树不为空,则还是要输出这个"空括号":
if(root->left || root->right)//左为空但是右不为空也是不能跳过的
{
str += "(";
str += tree2str(root->left);
str += ")";
}
而对于右子树,则不需要这么复杂的判断了.
代码
class Solution {
public:
string tree2str(TreeNode* root) {
if(root == nullptr)
return "";
string str = "";
str+= to_string(root->val);
if(root->left || root->right)//左为空但是右不为空也是不能跳过的
{
str += "(";
str += tree2str(root->left);
str += ")";
}
if(root->right)//右边不为空的话也要写括号
{
str += "(";
str += tree2str(root->right);
str += ")";
}
return str;
}
};