536. Construct Binary Tree from String 从括号字符串中构建二叉树

Posted immiao0319

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了536. Construct Binary Tree from String 从括号字符串中构建二叉树相关的知识,希望对你有一定的参考价值。

[抄题]:

You need to construct a binary tree from a string consisting of parenthesis and integers.

The whole input represents a binary tree. It contains an integer followed by zero, one or two pairs of parenthesis. The integer represents the root‘s value and a pair of parenthesis contains a child binary tree with the same structure.

You always start to construct the left child node of the parent first if it exists.

Example:

Input: "4(2(3)(1))(6(5))"
Output: return the tree root node representing the following tree:

       4
     /       2     6
   /    / 
  3   1 5   

 

Note:

  1. There will only be ‘(‘‘)‘‘-‘ and ‘0‘ ~ ‘9‘ in the input string.
  2. An empty tree is represented by "" instead of "()".

 [暴力解法]:

时间分析:

空间分析:

 [优化后]:

时间分析:

空间分析:

[奇葩输出条件]:

[奇葩corner case]:

注意下:取数可以多取几位,i+1位是数字时就继续i++

[思维问题]:

感觉我在背题:几天不背,功力全无。substring都忘了。

[英文数据结构或算法,为什么不用别的数据结构或算法]:

[一句话思路]:

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

[一刷]:

 

  1. new TreeNode(Integer.valueOf(s.substring(j, i + 1)))字符串不能直接转node,需要转interger后再转node
  2. 一直往后移用的是while循环

[二刷]:

  1. new TreeNode(Integer.valueOf(s.substring(j, i + 1))) j的初始值是i,计算之后也应该更新为新的i 

[三刷]:

[四刷]:

[五刷]:

  [五分钟肉眼debug的结果]:

[总结]:

从i j中截取字符串, j应该跟随i更新

[复杂度]:Time complexity: O() Space complexity: O()

[算法思想:迭代/递归/分治/贪心]:

[关键模板化代码]:

 

for (int i = 0, j = i; i < s.length(); i++, j = i) {
                        TreeNode node = new TreeNode(Integer.valueOf(s.substring(j, i + 1)));
        }

 

[其他解法]:

[Follow Up]:

[LC给出的题目变变变]:

 [代码风格] :

 [是否头一次写此类driver funcion的代码] :

 [潜台词] :

技术分享图片
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode str2tree(String s) {
        //corner case
        if (s == null || s.length() == 0) return null;
        
        //initialization: stack
        Stack<TreeNode> stack = new Stack<TreeNode>();
        
        //for loop: new node, get substring and append
        for (int i = 0, j = i; i < s.length(); i++, j = i) {
            //get c
            char c = s.charAt(i);
            
            //if c is )
            if (c == ‘)‘) stack.pop();
            else if ((c >= ‘0‘ && c <= ‘9‘) || (c == ‘-‘)) {
                    //continue
                    while (i + 1 < s.length() && s.charAt(i + 1) >= ‘0‘ && s.charAt(i + 1) <= ‘9‘) i++;
                        //build new node
                        TreeNode node = new TreeNode(Integer.valueOf(s.substring(j, i + 1)));
                        if (!stack.isEmpty()) {
                            TreeNode parent = stack.peek();
                            //get left and append
                            if (parent.left != null) {
                                parent.right = node;
                            }
                            else parent.left = node;
                        }
                        stack.push(node);
                }
            
        }
        
        //return the last root
        return stack.peek() == null ? null : stack.pop();
    }
}
View Code

 


以上是关于536. Construct Binary Tree from String 从括号字符串中构建二叉树的主要内容,如果未能解决你的问题,请参考以下文章

Construct Binary Tree from Preorder and Inorder Traversal

99. Recover Binary Search Tre

Construct Binary Tree

606. Construct String from Binary Tree

606. Construct String from Binary Tree

[Leetcode] Binary tree-- 606. Construct String from Binary Tree