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

题目来源:606. 根据二叉树创建字符串

2022.03.19 每日一题

LeetCode 题解持续更新中Github仓库地址 CSDN博客地址

在开始本题之前,可以先看看这篇文章树的基本知识以及种种遍历方法。

本题目就是使用前序遍历,可以使用 递归的方法,和迭代的方法进行前序遍历(具体方法在链接里面树的基本知识以及种种遍历方法),同时在相应的地方添加括号

首先我们需要知道括号的添加的情况

递归方法

class Solution {public:// 创建 一个空字符串,用来统计结果string res = "";string tree2str(TreeNode *root) {dfs(root);// 截取相应的字符串return res.substr(1, res.size() - 2);}// 创建递归函数void dfs(TreeNode *root) {// 如果节点是空的就跳出递归if (root == nullptr) return;// 将每次前序遍历都套上括号res += "(";// 并将相应的值加入到字符串中res += to_string(root->val);// 讨论各种情景if (root->left != nullptr) dfs(root->left);else if (root->right != nullptr) res += "()";if (root->right != nullptr) dfs(root->right);res += ")";}
};
class Solution {// 创建 一个空字符串,用来统计结果String res = "";public String tree2str(TreeNode root) {dfs(root);return res.substring(1, res.length() - 1);}// 创建递归函数public void dfs(TreeNode root) {// 如果节点是空的就跳出递归if (root == null) return;// 将每次前序遍历都套上括号res += "(";// 并将相应的值加入到字符串中res += Integer.toString(root.val);// 讨论各种情景if (root.left != null) dfs(root.left);else if (root.right != null) res += "()";if (root.right != null) dfs(root.right);res += ")";}
}

迭代

迭代的方法与树的前序遍历的迭代方法逻辑一样,

  • 如果节点有两个子节点,则先将右节点放入栈中,再将左节点放入栈中
  • 如果节点没有任何的子节点,就不对栈进行任何操作
  • 如果只有一个左节点,就将左节点放入栈中
  • 如果只有一个右节点,就先再结果末尾添加一对括号,再将右节点放入栈中
class Solution {public:string tree2str(TreeNode *root) {string res = "";// 创建栈用于存储各个节点用于模拟树的前序遍历stack<TreeNode *> st;// 放入头节点st.push(root);set<TreeNode *> visited;while (!st.empty()) {// 将当前节点放入栈中TreeNode *node = st.top();// 如果当前节点被访问过,说明以该节点为根节点的子树已经遍历完成if (!visited.count(node)) {// 添加括号,并且从栈中移除当前节点if (node != root) res += ")";st.pop();} else {// 如果没有被访问过,就开始添加新的括号,并将子节点加入栈中if (node != root) res += "(";res += node->val;if (node->left == nullptr && node->right != nullptr) res += "()";if (node->right != nullptr) st.push(node->right);if (node->left != nullptr) st.push(node->left);}}return res;}
};
class Solution {public String tree2str(TreeNode root) {String res = "";// 创建栈用于存储各个节点用于模拟树的前序遍历Deque<TreeNode> st = new ArrayDeque<TreeNode>();// 放入头节点st.push(root);Set<TreeNode> visited = new HashSet<>();while (!st.isEmpty()) {// 将当前节点放入栈中TreeNode node = st.peek();// 如果当前节点被访问过,说明以该节点为根节点的子树已经遍历完成if (!visited.add(node)) {// 添加括号,并且从栈中移除当前节点if (node != root) res += ")";st.pop();} else {// 如果没有被访问过,就开始添加新的括号,并将子节点加入栈中if (node != root) res += "(";res += node.val;if (node.left == null && node.right != null) res += "()";if (node.right != null) st.push(node.right);if (node.left != null) st.push(node.left);}}return res;}
}

LeetCode 606. 根据二叉树创建字符串题解相关推荐

  1. 【浅刷Java数据结构】Leetcode 606 根据二叉树创建字符串

    链接: Leetcode 606 根据二叉树创建字符串 整体思路: 题目要求按照前序遍历的方式遍历.(根(左子树)(右子树)) 根为空直接返回. 根不为空时:看左右子树是否空,就可以分类讨论: 左树为 ...

  2. LeetCode 606. 根据二叉树创建字符串(递归)

    文章目录 1. 题目 2. 递归解题 1. 题目 你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串. 空节点则用一对空括号 "()" 表示.而且你需要省略所 ...

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

    题目链接:leetcode606 题目链接 此题的题目虽然是简单题,但是想要读懂,个人感觉有些难度,虽然是简单题,但是想要读懂还有不小的难度的, 直接说结论,对着结论去读懂题目应该会简单不少. 结论: ...

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

    解题思路: 在前序遍历的基础上增加了一些步骤,分3个情况 无左右子树 无左子树,又右子树 有左子树无右子树 同时具有左右子树 对于每个情况,只需根据题意再各个地方加上括号即可,这里2.4为一种情况,同 ...

  5. 【LeetCode】606.根据二叉树创建字符串

    链接: [LeetCode]606.根据二叉树创建字符串 思路 使用二叉树的中序遍历,需要注意的是当左节点为空,右节点不为空的时候要加上(). 代码 class Solution { public:s ...

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

    606. 根据二叉树创建字符串 Ideas 把我珍藏多年的二叉树前序遍历代码模板呈上来: def preorderTraversalLoop(node):if not node:returnstack ...

  7. LeetCode 每日一题:606. 根据二叉树创建字符串

    606. 根据二叉树创建字符串 二叉树的前序遍历,当左子节点或者右节点非空的时候需要添加左子节点的括号,如果右子节点非空才需要添加右子节点的括号 /*** Definition for a binar ...

  8. 题目:606.根据二叉树创建字符串

    ​ ​题目来源: leetcode题目,网址:606. 根据二叉树创建字符串 - 力扣(LeetCode) 解题思路: 递归遍历二叉树,按要求输出即可. 解题代码: /*** Definition f ...

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

    题目 606.根据二叉树创建字符串 题目大意 你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串. 空节点则用一对空括号 "()" 表示.而且你需要省略所有不 ...

最新文章

  1. 安装NodeJS环境报错
  2. 在Servlet中向客户端写Cookie信息
  3. HDU 3046 Pleasant sheep and big big wolf 最小割
  4. 简单计算器 逆波兰表达式
  5. boost::successive_shortest_path_nonnegative_weights用法的测试程序
  6. 6号团队-团队任务4:每日立会(2018-11-28)
  7. 推荐一款自动化代码变量命名在线工具
  8. 嵌入式linux实验一vim的使用,嵌入式Linux C语言开发工具—vi/vim实训操作
  9. 为何阿里开发手册中,线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式
  10. 决策树,随机森林,集成学习的算法实现
  11. html5font标签菜鸟教程,菜鸟教程
  12. 华为USG6000 防火墙默认设置
  13. JAVA输出100以内素数
  14. 工商银行近20年实时大数据平台建设历程
  15. NOIP2017提高成绩
  16. 使用LODOP设计打印模板
  17. OpenDDS开发人员指南中文版3.23(2)入门
  18. 数学教程之14本用于早期数学学习的精美插图儿童读物
  19. css3基础知识总结
  20. 怎样来实现数据接口的加密?

热门文章

  1. 却话文心一言(Chatgpt们),存算一体真能突破AI算力“存储墙”|“能耗墙”|“编译墙”?
  2. 工程技术人员以计算机为辅助工具,上海工程技术大学机械CADCAM考试复习资料
  3. BootLoader——嵌入式系统的引导加载程序
  4. U盘启动盘装Linux系统: 以Kali为例
  5. 查找文献必备的文献下载神器
  6. 三星N900刷机包 港版4.4.2精简 官方原汁原味 卡刷包
  7. PHP语言之华为应用内支付IAP验签
  8. 推荐收藏系列:一文理解JVM虚拟机(内存、垃圾回收、性能优化)解决面试中遇到问题(图解版)
  9. 【JavaScript】节点的常用属性和方法
  10. kafka日志清理策略,compact和delete