当前位置: 代码迷 >> 综合 >> 【Lintcode】880. Construct Binary Tree from String
  详细解决方案

【Lintcode】880. Construct Binary Tree from String

热度:43   发布时间:2024-03-05 23:44:42.0

题目地址:

https://www.lintcode.com/problem/construct-binary-tree-from-string/description

给定一个字符串,只含左括号、右括号、负号和0?90\sim 90?9的数字。要求将其构造为一棵二叉树。构造规则是这样的,字符串要么是空串(则返回空树),要么以一个数开头(可正可负),后面接着两块括号,第一个括号内是左子树对应的字符串,第二个是右子树对应的字符串(当然也可能只有左子树没有右子树)。返回树根。

思路是递归。先解析字符串,解析出树根,树根一定在开头,所以还比较好解析出来。接下来解析左右子树。方式是,用一个变量记录左括号减去右括号数量,当这个变量等于000的时候,就意味着解析出来了一个子树,递归构造之,append到树根左边即可。右子树同理。代码如下:

public class Solution {
    /*** @param s: a string* @return: a root of this tree*/public TreeNode str2tree(String s) {
    // write your code hereif (s == null || s.isEmpty()) {
    return null;}// 解析出树根int i = 0;while (i < s.length() && s.charAt(i) != '(') {
    i++;}int r = Integer.parseInt(s.substring(0, i));TreeNode root = new TreeNode(r);// l记录左括号减去右括号数目int l = 0;boolean left = true;for (int j = i; j < s.length(); j++) {
    if (s.charAt(j) == '(') {
    l++;} else if (s.charAt(j) == ')') {
    l--;}if (l == 0 && left) {
    root.left = str2tree(s.substring(i + 1, j));left = false;i = j + 1;} else if (l == 0) {
    root.right = str2tree(s.substring(i + 1, j));}}return root;}
}class TreeNode {
    int val;TreeNode left, right;TreeNode(int x) {
    val = x;}
}

时间复杂度O(n)O(n)O(n),空间O(h)O(h)O(h)hhh为树高。

  相关解决方案