leetcode-606. Construct String from Binary Tree

606. Construct String from Binary Tree

You need to construct a string consists of parenthesis and integers from a binary tree with the preorder traversing way.

The null node needs to be represented by empty parenthesis pair "()". And you need to omit all the empty parenthesis pairs that don't affect the one-to-one mapping relationship between the string and the original binary tree.

Example 1:

Input: Binary tree: [1,2,3,4]
       1
     /   \
    2     3
   /    
  4     

Output: "1(2(4))(3)"

Explanation: Originallay it needs to be "1(2(4)())(3()())",
but you need to omit all the unnecessary empty parenthesis pairs.
And it will be "1(2(4))(3)".

Example 2:

Input: Binary tree: [1,2,3,null,4]
       1
     /   \
    2     3
     \  
      4 

Output: "1(2()(4))(3)"

Explanation: Almost the same as the first example,
except we can't omit the first parenthesis pair to break the one-to-one mapping relationship between the input and the out


题解:

肯定首先想到的是先序遍历二叉树,主要就是()和val的值怎么组织。

自己也没弄清楚,后来看的solution,想把思路梳理一遍。


首先对比实例中给出的两个二叉树和对应的结果,可以发现,在没有左子树和没有右子树的两种情况,是两种不同的方式,在没有左子树时,是需要添加一个()的,而没有右子树的情况下,是不需要的。


第一种递归写法:

所以一共就有如下几种情况(默认情况下没有左子树或者没有右子树都添加(),把没有右子树单独处理):

  1. t 为 null,返回“”。这是收敛条件
  2. t.left 和 t.right 都为 null,这是要返回 t.val + ""  (是为了返回String格式)
  3. t.left != null 但是 t.right == null,这时,要返回 t.val + "(" + tree2str(t.left) + ")"。不考虑右子树
  4. 默认情况:返回  t.val + "(" + tree2str(t.left) + ")" + "(" + tree2str(t.right) + ")";

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) + ")";
    }
}


第二种使用stack

这种的默认处理方式是都按照"(" + t.val + ")"来处理,遇到左子树为空但是右子树不为空的情况单独处理(额外添加"()")。然后第一个节点和最后一个节点的"()"被舍弃.

使用Stack和set来记录是否遍历过该结点,以确定添加 "("  还是  “)” 

其中先添加right,再添加left,因为Stack为先进后出


转载于:https://www.cnblogs.com/linkcode/p/8150786.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值