13.力扣-树-根据二叉树创建字符串

力扣-树-根据二叉树创建字符串

根据二叉树创建字符串(LeetCode 606)

  • 题目概述:
    你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。

  • 题目案例:
    在这里插入图片描述

  • 解题思路:围绕前序遍历展开,主要的讨论在左右结点是否为空,因为左节点为空时要保留括号,右节点为空时省略括号分为四种情况讨论
    (1)左右结点均为空(2)左节点为空,右节点不为空(3)左节点不为空,右节点为空(4)左右结点均不为空
    下面的解法分为递归和迭代两种解法,由于以前没有总结过树的递归(迭代)遍历,所以下一篇文章会总结一下,方便于本题的迭代解法

  • 递归java代码

class Solution {
    public String tree2str(TreeNode root) {
        if(root==null)
            return "";
        if(root.left==null&&root.right==null){
            //为了能够转为String类型,所以加“”
            return root.val+"";
        }
        //如果右为空则括号可以省略
        if(root.right==null)
            return root.val+"("+tree2str(root.left)+")";
        //如果左为空则要保留括号
        return root.val+"("+tree2str(root.left)+")("+tree2str(root.right)+")";
    }
}

  • 迭代java代码
class Solution1 {
    public String tree2str(TreeNode t) {
        if (t == null)
            return "";
        Stack < TreeNode > stack = new Stack< >();
        stack.push(t);
        //创建已经遍历过的结点集合
        Set< TreeNode > visited = new HashSet< >();
        //创建拼接字符串
        StringBuilder s = new StringBuilder();
        while (!stack.isEmpty()) {
            //查看栈顶内容,注意不要用pop(),否则之后无法添加")"
            t = stack.peek();
            //visited中有该节点,说明该结点的左右均已遍历完成,可以加")"
            if (visited.contains(t)) {
                stack.pop();
                s.append(")");
            } else {
                visited.add(t);
                s.append("(" + t.val);
                if (t.left == null && t.right != null)
                    s.append("()");
                //这里注意if的顺序,因为是前序遍历,所以先压右结点,再压左节点
                if (t.right != null)
                    stack.push(t.right);
                if (t.left != null)
                    stack.push(t.left);
            }
        }
        //最开始会在最前面多家一个"(",需要去掉
        return s.substring(1, s.length() - 1);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值