1. 程式人生 > >LeetCode Construct String from Binary Tree 根據二叉樹建立字串

LeetCode 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)"

你需要採用前序遍歷的方式,將一個二叉樹轉換成一個由括號和整陣列成的字串。

空節點則用一對空括號 "()" 表示。而且你需要省略所有不影響字串與原始二叉樹之間的一對一對映關係的空括號對。

示例 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)"

解釋: 和第一個示例相似,
除了我們不能省略第一個對括號來中斷輸入和輸出之間的一對一對映關係。

題解:給定一棵二叉樹,通過二叉樹的前序遍歷,將其前序遍歷放入到一個string中。此題一看就可以用遞迴來做,首先是放入根節點,然後根據先序遍歷的特點,先遍歷左子樹,如果左子樹不為空,那麼先將'('壓入到一個list中,然後再遞迴該左子樹,遞迴結束後,再將')'壓入到list中;以此類推。但是這裡必須考慮一種特殊情況,即當根節點的左子樹為空,而右子樹不為空時,應該要壓入'()',然後再根據遍歷右子樹的節點,壓入到list中,而不能直接不講'()'壓入list中;而且這裡有一個小小的tip,最好將節點的值轉化為string,然後壓入list中,而不要轉化為character;其次,在最後將list儲存到string中時,不要直接讀入string,因為通過string += list.get(i)的方式,每次都會在記憶體中新生成一個string;因為,最好是通過新生成一個stringbuilder物件,通過stringbuilder.append()方式累加,然後在通過stringbuilder.tostring()方式來將其轉化為string。

public static String tree2str(TreeNode t)
    {
        if(t == null)
            return "";
        List<String> list = new ArrayList<>();
        transfer(t,list);
        StringBuilder res = new StringBuilder();  //這裡不能用strin,否則空間複雜度太高,因為每次都會生成一個string型別
        while(!list.isEmpty())
        {
            res.append(list.get(0));
            list.remove(0);
        }
        return res.toString();
    }
    public static void transfer(TreeNode root,List<String> list)
    {
        if(root == null)       //遞迴的思想來做
            return;
        list.add(String.valueOf(root.val));
        if(root.left != null)
        {
            list.add("(");
            transfer(root.left,list);
            list.add(")");
        }
        if(root.left == null && root.right != null)   //這種情況得另外考慮,即當左子樹為空,而右子樹不為空時,還是需要將()壓入到list中
        {
            list.add("(");
            list.add(")");
        }
        if(root.right != null)
        {
            list.add("(");
            transfer(root.right,list);
            list.add(")");
        }
    }