LeCode:(606. 根据二叉树创建字符串)

2024-01-07 19:58:13

题目链接
在这里插入图片描述

本体的难点:

  1. 什么时候去打印左右括号?
  2. 什么时候省略?

解题过程:通过观察看到,每次遍历结点之前,打印了一个左括号;遍历到叶子,叶子的左右也要打印出括号来(先不考虑省略)。然后每个结点遍历完,也要打印右括号,这样才能保证包起来。
先把这个过程写出来:

class Solution {
public:
    string tree2str(TreeNode* root) {
        if(root==nullptr)  //根为空,什么也不打印,因为进入这个结点之前,已经打印左括号了,再出来就会打印右括号。
        {
            return "";
        }
        string str = to_string(root->val);
        
        str += "(";
        str += tree2str(root->left);
        str+=")";

        str+="(";
        str+=tree2str(root->right);
        str+=")";
        return str;
    }
};

什么时候省略呢?

  • 左右孩子都为空 省略
  • 右孩子为空,左孩子不为空 省略
  • 左为空,右孩子不为空 不省略
 //左右都为空   省略
 //左为空,右不为空  不省略
 //右为空,左不为空  省略
class Solution {
public:
    string tree2str(TreeNode* root) {
        if(root==nullptr)
        {
            return "";
        }
        string 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;
    }
};

这个代码虽然不难,但是这个代码的结构很难想出来,希望读者能够好好思考这道题,左右括号,写在哪里,才能满足题目要求!

文章来源:https://blog.csdn.net/weixin_45153969/article/details/135435890
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。