[抄题]:
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:
- There will only be
‘(‘
,‘)‘
,‘-‘
and‘0‘
~‘9‘
in the input string. - An empty tree is represented by
""
instead of"()"
.
[暴力解法]:
时间分析:
空间分析:
[优化后]:
时间分析:
空间分析:
[奇葩输出条件]:
[奇葩corner case]:
注意下:取数可以多取几位,i+1位是数字时就继续i++
[思维问题]:
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 22.0px; font: 15.0px "Helvetica Neue" }
感觉我在背题:几天不背,功力全无。substring都忘了。
[英文数据结构或算法,为什么不用别的数据结构或算法]:
[一句话思路]:
[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):
[画图]:
[一刷]:
new TreeNode(Integer.valueOf(s.substring(j, i + 1)))字符串不能直接转node,需要转interger后再转node
- 一直往后移用的是while循环
[二刷]:
- 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(); } }
原文地址:https://www.cnblogs.com/immiao0319/p/9612471.html