前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【算法千题案例】每日LeetCode打卡——86.根据二叉树创建字符串

【算法千题案例】每日LeetCode打卡——86.根据二叉树创建字符串

作者头像
呆呆敲代码的小Y
发布2021-11-30 09:34:03
3280
发布2021-11-30 09:34:03
举报
文章被收录于专栏:呆呆敲代码的小Y 公众号

原题样例:根据二叉树创建字符串

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

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

示例1:

代码语言:javascript
复制
输入: 二叉树: [1,2,3,4]
       1
     /   \
    2     3
   /    
  4     

输出: "1(2(4))(3)"

解释: 原本将是“1(2(4)())(3())”,
在你省略所有不必要的空括号对之后,
它将是“1(2(4))(3)”。

示例2:

代码语言:javascript
复制
输入: 二叉树: [1,2,3,null,4]
       1
     /   \
    2     3
     \  
      4 

输出: "1(2()(4))(3)"

解释: 和第一个示例相似,
除了我们不能省略第一个对括号来中断输入和输出之间的一对一映射关系。

提示:

  • 两个列表的长度范围都在 [1, 1000]内。
  • 两个列表中的字符串的长度将在[1,30]的范围内。
  • 下标从0开始,到列表的长度减1。
  • 两个列表都没有重复的元素。

C#方法:递归遍历

递归遍历,遇到空节点的时候使用()代替

代码:

代码语言:javascript
复制
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left;
 *     public TreeNode right;
 *     public TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
           StringBuilder str = new StringBuilder();
        public string Tree2str(TreeNode t)
        {
           
            if (t!=null)
            {
                def(t);
            }
            return str.ToString();
        }
        public void def(TreeNode root)
        {
            if (root==null)
            {
                return;
            }
             str.Append(root.val);
            if (root.left!=null|| root.right != null)
            {
                str.Append('(');
                def(root.left);
                str.Append(')');
            }
            if (root.right != null)
            {
                str.Append('(');
                def(root.right);
                str.Append(')');
            }            
        }

}

执行结果

代码语言:javascript
复制
通过
执行用时:92 ms,在所有 C# 提交中击败了92.50%的用户
内存消耗:40.9 MB,在所有 C# 提交中击败了84.90%的用户

Java 方法:递归

思路解析 可以使用递归的方法得到二叉树的前序遍历。在递归时,根据题目描述,我们需要加上额外的括号,会有以下 4 种情况:

  • 如果当前节点有两个孩子,那我们在递归时,需要在两个孩子的结果外都加上一层括号;
  • 如果当前节点没有孩子,那我们不需要在节点后面加上任何括号;
  • 如果当前节点只有左孩子,那我们在递归时,只需要在左孩子的结果外加上一层括号,而不需要给右孩子加上任何括号;
  • 如果当前节点只有右孩子,那我们在递归时,需要先加上一层空的括号 () 表示左孩子为空,再对右孩子进行递归,并在结果外加上一层括号。

虑完上面的 4 种情况,我们就可以得到最终的字符串。

代码:

代码语言:javascript
复制
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public String tree2str(TreeNode t) {
        if(t==null)
            return "";
        if(t.left==null && t.right==null)
            return t.val+"";
        if(t.right==null)
            return t.val+"("+tree2str(t.left)+")";
        return t.val+"("+tree2str(t.left)+")("+tree2str(t.right)+")";   
    }
}

执行结果

代码语言:javascript
复制
通过
执行用时:15 ms,在所有 Java  提交中击败了44.08%的用户
内存消耗:40.1 MB,在所有 Java 提交中击败了24.40%的用户

复杂度分析

代码语言:javascript
复制
时间复杂度:O( n )
空间复杂度:O(n) 

总结

  • 今天是力扣算法题打卡的第八十六天!
  • 文章采用 C#Java 两种编程语言进行解题
  • 一些方法也是参考力扣大神写的,也是边学习边分享,再次感谢算法大佬们
  • 那今天的算法题分享到此结束啦,明天再见!
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/11/29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原题样例:根据二叉树创建字符串
    • C#方法:递归遍历
      • Java 方法:递归
        • 总结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档