给你二叉树的根节点root,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。
空节点使用一对空括号对"root"表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。
示例一:
输入:root = [1,2,3,4]
输出:"1(2(4))(3)"
解释:初步转化后得到 "1(2(4)())(3()())" ,但省略所有不必要的空括号对后,字符串应该是"1(2(4))(3)" 。
示例二:
输入:root = [1,2,3,null,4] 输出:"1(2()(4))(3)" 解释:和第一个示例类似,但是无法省略第一个空括号对,否则会破坏输入与输出一一映射的关系。
这是一道经典的二叉树OJ题,考察了做题人对前序遍历以及二叉树部分知识的掌握程度,常见方法使用递归实现,首先要读懂题目,题目根本的要求就是将树以前序遍历的格式保存在字符串中并返回,顾名思义就是先保存根节点然后将左子树用()保存再将右子树用()保存,如果左子树为空则只保存括号,若右子树为空则直接省略(因为如果左子树为空直接省略,直接保存右子树就会导致无法分辨该节点到底是左节点还是右节点,所以左节点不能直接省略)。
class Solution {
public:
string tree2str(TreeNode* root)
{
if(root==nullptr)//判空
return"";
//to_string可以将数字转变为字符并返回该字符
string ret=to_string(root->val);//前序遍历,先将当前节点的值赋给字符串
if(root->left!=nullptr||root->right!=nullptr)//如果有子树再继续往下递归
{
ret+="(";//无论有没有左子树都要给()所以不用判断直接给
ret+=tree2str(root->left);
ret+=")";
if(root->right!=nullptr)//右子树判空如果为空就直接不进入递归,有值再进入
{
ret+="(";
ret+=tree2str(root->right);
ret+=")";
}
}
return ret;//返回字符串
}
};