题目描述
你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。
空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/construct-string-from-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
递归思路一:分四种情况讨论
分析:
情况四递归分析:
参考代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
string tree2str(TreeNode* root) {
if(root == nullptr)
return "";
if(root->left == nullptr && root->right == nullptr)
return to_string(root->val) ;
if(root->right == nullptr)
return to_string(root->val) + "(" + tree2str(root->left) + ")";
return to_string(root->val) + "(" + tree2str(root->left) + ")" + "(" + tree2str(root->right) + ")";
}
};
递归思路二
特殊情况分析:
参考代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
string tree2str(TreeNode* root) {
//1.空树
if(root == nullptr)
return "";
string str;
str += to_string(root->val);
//2.左子树不为空 或者 右子树不为空
if(root->left || root->right)
str = str + "(" + tree2str(root->left) + ")";
//3.右子树不为空
if(root->right)
str = str + "(" + tree2str(root->right) + ")";
return str;
}
};
反思:
上述算法使用的是传值返回,当树比较大时,会有大量的string深拷贝,所以通过方法三,我们可以减少拷贝次数。
思路三:减少深拷贝方法
参考代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
void _tree2str(TreeNode* root, string& str)
{
if(root == nullptr) return ;
str += to_string(root->val);
//左树不为空 或者 有数不为空
if(root->left || root->right)
{
str += "(";
_tree2str(root->left, str);//遍历左树,左树为空也可以
cout<<str<<endl;
str += ")";
}
if(root->right)
{
str += "(";
_tree2str(root->right, str);
str += ")";
}
}
string tree2str(TreeNode* root) {
string s;
_tree2str(root, s);
return s;
}
};