写点什么

手撸二叉树之根据二叉树创建字符串

发布于: 3 小时前
手撸二叉树之根据二叉树创建字符串

Hello, 大家好,今天是我参加 8 月更文的第 21 天,今天给大家带来的关于二叉树相关的算法题是根据二叉树创建字符串,正文如下:

题目

你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。


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


示例 1:


输入: 二叉树: [1,2,3,4]       1     /   \    2     3   /      4     
输出: "1(2(4))(3)"
解释: 原本将是“1(2(4)())(3())”,在你省略所有不必要的空括号对之后,它将是“1(2(4))(3)”。
复制代码


示例 2:


输入: 二叉树: [1,2,3,null,4]       1     /   \    2     3     \        4 
输出: "1(2()(4))(3)"
解释: 和第一个示例相似,除了我们不能省略第一个对括号来中断输入和输出之间的一对一映射关系。
复制代码

思路分析

根据题目给出的示例分析来看,我们可以用二叉树的前序遍历来解答此题。


由于需要加上括号,可以分为以下 4 种情况:


  1. 如果当前节点有两个孩子,那我们在递归时,需要在两个孩子的结果外都加上一层括号;

  2. 如果当前节点没有孩子,那我们不需要在节点后面加上任何括号;

  3. 如果当前节点只有左孩子,那我们在递归时,只需要在左孩子的结果外加上一层括号,而不需要给右孩子加上任何括号;

  4. 如果当前节点只有右孩子,那我们在递归时,需要先加上一层空的括号 () 表示左孩子为空,再对右孩子进行递归,并在结果外加上一层括号。


通过上面的 4 中情况,我们就可以创建最终的字符串了。

代码实现

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode() {} *     TreeNode(int val) { this.val = val; } *     TreeNode(int val, TreeNode left, TreeNode right) { *         this.val = val; *         this.left = left; *         this.right = right; *     } * } */class Solution {    public String tree2str(TreeNode root) {        if (root == null) {            return "";        }        // 没有左,右子节点        if (root.left == null && root.right == null) {            return root.val + "";        }        // 右节点为空        if (root.right == null) {            return root.val + "(" + tree2str(root.left) + ")";        }
return root.val + "(" + tree2str(root.left) + ")" + "(" + tree2str(root.right) + ")"; }}
复制代码

最后

复杂度分析:


  • 时间复杂度:O(N),其中 N 是二叉树中的节点数目。

  • 空间复杂度:O(N),在最坏情况下,会递归 N 层,需要 O(N) 的栈空间。

发布于: 3 小时前阅读数: 2
用户头像

佛系编码 2019.05.13 加入

红鲤鱼与绿鲤鱼与驴。

评论

发布
暂无评论
手撸二叉树之根据二叉树创建字符串