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"()" 
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    private int start = 0;
    public TreeNode str2tree(String s) {
        if (s == null || s.length() == 0) {
            return null;
        }
        return str2treeHelper(s);
    }
    private TreeNode str2treeHelper(String s) {
        if (start >= s.length()) {
            return null;
        }
        // parse int
        //
        boolean neg = false;
        if (s.charAt(start) == '-') {
            neg = true;
            start++;
        }
        int num = 0;
        while (start < s.length() && Character.isDigit(s.charAt(start))) {
            int digit = Character.getNumericValue(s.charAt(start));
            num = num * 10 + digit;
            start++;
        }
        if (neg) {
            num = -num;
        }
        TreeNode root = new TreeNode(num);
        if (start >= s.length()) {
            return root;
        }
        // go to left child
        //
        if (start < s.length() && s.charAt(start) == '(') {
            start++;
            root.left = str2treeHelper(s);
        }
        if (start < s.length() && s.charAt(start) == ')') {
            start++;
            return root;
        }
        // go to the right child
        //
        if (start < s.length() && s.charAt(start) == '(') {
            start++;
            root.right = str2treeHelper(s);
        }
        if (start < s.length() && s.charAt(start) == ')') {
            start++;
            return root;
        }
        return root;
    }
}
No comments:
Post a Comment