二叉树进阶算法题:《根据二叉树创建字符串》

目录

一、题目链接:

二、题目描述

三、解题思路

1. 基本思路

2. 详细步骤

3. 优化空括号对

4. 代码实现


一、题目链接:

606. 根据二叉树创建字符串

二、题目描述

        给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。

        空节点使用一对空括号对 "()" 表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。

示例 1:

二叉树进阶算法题:《根据二叉树创建字符串》_第1张图片

输入:root = [1,2,3,4]
输出:"1(2(4))(3)"
解释:初步转化后得到 "1(2(4)())(3()())" ,但省略所有不必要的空括号对后,字符串应该是"1(2(4))(3)" 。

示例 2:

二叉树进阶算法题:《根据二叉树创建字符串》_第2张图片

输入:root = [1,2,3,null,4]
输出:"1(2()(4))(3)"
解释:和第一个示例类似,但是无法省略第一个空括号对,否则会破坏输入与输出一一映射的关系。

提示:

  • 树中节点的数目范围是 [1, 104]
  • -1000 <= Node.val <= 1000

三、解题思路

1. 基本思路

        采用递归的前序遍历方法,依次处理根节点、左子树和右子树。根据题目要求,需要在字符串中正确表示节点关系,同时优化不必要的括号。

2. 详细步骤

  1. 根节点处理:直接将根节点的值转换为字符串添加到结果中。

  2. 左子树处理

    • 如果左子树或右子树存在,则需要添加左括号并递归处理左子树,然后添加右括号。

    • 这是因为即使左子树为空,只要右子树存在,就需要保留左子树的空括号对,以保持结构的正确性。

  3. 右子树处理

    • 只有当右子树存在时,才需要添加左括号并递归处理右子树,然后添加右括号。

    • 如果右子树不存在,则无需添加任何内容。

优化空括号对关键在于判断何时需要保留空括号对):

  • 当左子树为空但右子树存在时,必须保留左子树的空括号对。

  • 当左子树和右子树都为空时,可以省略左子树的空括号对。

3. 代码实现

class Solution 
{
public:
    string tree2str(TreeNode* root) 
    {
        string str; // 存储结果字符串
        if (root == nullptr) 
        {
            return 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; // 返回最终字符串
    }
};

你可能感兴趣的:(数据结构,c++,二叉树)