根据二叉树创建字符串
一:题目
解释:
对题目的解析
二:思路
①先写一个前序遍历出来
解释:
测试结果来看 我们的前序遍历是成功的
②:再进行括号的插入
括号可以省略,那省略的要求是什么?
一个节点 左右孩子都为空 则两个空括号都省略
一个节点 左孩子为空 右孩子不为空 则左孩子的空括号不能省略 否则无法区分到底谁为空
一个节点 左孩子不为空 右孩子为空 则右孩子的空括号能省略
三:解题代码
class Solution {
public:
string tree2str(TreeNode* root) {
if(root == nullptr)
return "";
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;
}
};
解释:
if(root->left!=nullptr || root->right!=nullptr)
通过此判断,代表左孩子的括号不能省略,那什么情况左孩子的括号才不能省略呢 ?
①:只有左子节点 → 条件 true 左孩子本身就需要括号
②:只有右子节点 → 条件 true 为了避免歧义 左孩子需要括号
③:左右子节点都有 → 条件 true 由于操作符的特性,④其实就是①的情况
这几种情况,的确左孩子的括号不能省略
if(root->right!=nullptr)
而右孩子的括号不能省略的情况就一种 右孩子存在则不能省略
注意:
该题目所给的函数的返回值是string ,所以在递归的过程中,遇到空节点,返回的是"",一个空字符串
四:对题目的质疑
原题的示例1的解释如下:
其实这是错的 应该是博主的在4的后面再加两个括号,因为你的3后面都有两个空括号代表其左右孩子为空 4也应该加两个空括号