美文网首页
536. Construct Binary Tree from

536. Construct Binary Tree from

作者: matrxyz | 来源:发表于2018-01-13 16:34 被阅读0次

    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 "()".

    Solution1:Recursive

    思路:
    首先我们要做的是先找出根结点值,我们找第一个左括号的位置,如果找不到,说明当前字符串都是数字,直接转化为整型,然后新建结点返回即可。
    否则的话从当前位置开始遍历,因为当前位置是一个左括号,我们的目标是找到与之对应的右括号的位置,但是由于中间还会遇到左右括号,所以我们需要用一个变量cnt来记录左括号的个数,如果遇到左括号,cnt自增1,如果遇到右括号,cnt自减1,这样当某个时刻cnt为0的时候,我们就确定了一个完整的子树的位置。那么问题来了,这个子树到底是左子树还是右子树呢,我们需要一个辅助变量start,当最开始找到第一个左括号的位置时,将start赋值为该位置,那么当cnt为0时,如果start还是原来的位置,说明这个是左子树,我们对其调用递归函数,注意此时更新start的位置,这样就能区分左右子树了
    Time Complexity: O(N) Space Complexity: O(N)

    Solution2:Stack

    思路:
    借助栈stack来实现。
    遍历字符串s,用变量j记录当前位置i,
    如果遇到的是左括号,什么也不做继续遍历;
    如果遇到的是数字或者负号,那么我们将连续的数字都找出来,然后转为整型并新建结点,
    此时我们看stack中是否有结点,如果有的话,当前结点就是栈顶结点的子结点,如果栈顶结点没有左子结点,那么此结点就是其左子结点,反之则为其右子结点。之后要将此结点压入栈中。
    如果我们遍历到的是右括号,说明栈顶元素的子结点已经处理完了,将其移除栈。

    Time Complexity: O(N) Space Complexity: O(N)

    Solution1 Code:

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    // Input: "4(2(3)(1))(6(5))"
    
    class Solution {
        public TreeNode str2tree(String s) {
            if (s == null || s.length() == 0) return null;
            int firstParen = s.indexOf("(");
            int val = firstParen == -1 ? Integer.parseInt(s) : Integer.parseInt(s.substring(0, firstParen));
            TreeNode cur = new TreeNode(val);
            if (firstParen == -1) return cur;
            
            int start = firstParen, leftParenCount = 0;
            
            for (int i=start;i<s.length();i++) {
                if (s.charAt(i) == '(') leftParenCount++;
                else if (s.charAt(i) == ')') leftParenCount--;
                
                // left ()
                if (leftParenCount == 0 && start == firstParen) {
                    cur.left = str2tree(s.substring(start+1,i)); 
                    start = i+1; //从left()的) 跳到 right()的(
                }
                // right ()
                else if (leftParenCount == 0) {
                    cur.right = str2tree(s.substring(start+1,i));
                }
            }
            return cur;
        }
    }
    

    Solution2 Code:

    // Input: "4(2(3)(1))(6(5))"
    
    public class Solution {
        public TreeNode str2tree(String s) {
            Stack<TreeNode> stack = new Stack<>();
            for(int i = 0, j = i; i < s.length(); i++, j = i){
                char c = s.charAt(i);
                if(c == ')')    stack.pop();
                else if(c >= '0' && c <= '9' || c == '-'){
                    while(i + 1 < s.length() && s.charAt(i + 1) >= '0' && s.charAt(i + 1) <= '9') i++;
                    TreeNode currentNode = new TreeNode(Integer.valueOf(s.substring(j, i + 1)));
                    if(!stack.isEmpty()){
                        TreeNode parent = stack.peek();
                        if(parent.left != null)    parent.right = currentNode;
                        else parent.left = currentNode;
                    }
                    stack.push(currentNode);
                }
            }
            return stack.isEmpty() ? null : stack.peek();
        }
    }
    

    相关文章

      网友评论

          本文标题:536. Construct Binary Tree from

          本文链接:https://www.haomeiwen.com/subject/xiicoxtx.html