zoukankan      html  css  js  c++  java
  • 536. Construct Binary Tree from String

    package LeetCode_536
    
    import java.util.*
    
    /**
     * 536. Construct Binary Tree from String
     * (Prime)
     * 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 "()".
     * */
    class TreeNode(var value: Int){
        var left: TreeNode? = null
        var right: TreeNode? = null
    }
    class Solution {
        /*
        * solution: Stack with pre-order (root->left->right) traversal,the top of stack should be current root
        * Time complexity:O(n), Space complexity:O(n)
        * */
        fun str2Tree(s: String): TreeNode?{
            if (s==null || s.isEmpty()){
                return null
            }
            val stack = Stack<TreeNode>()
            for (i in s.indices){
                val c = s[i]
                if (c in '0'..'9' || c=='-'){
                    var start = i
                    //keep to find out the whole digit number
                    while (i+1<s.length && (s[i+1] in '0'..'9')){
                        start++
                    }
                    //create current node by get the number above
                    val curValue = s.substring(start,i+1).toInt()
                    val curNode = TreeNode(curValue)
                    if (stack.isNotEmpty()){
                        //curNode is the child node of top node
                        val top = stack.peek()
                        if (top.left == null){
                            top.left = curNode
                        } else {
                            top.right = curNode
                        }
                    }
                    stack.push(curNode)
                } else if (c==')') {
                    //mean current side had handle finish
                    stack.pop()
                }
            }
            //print the result
            traversal(stack.peek())
            return stack.peek()
        }
    
        //print by pre-order
        private fun traversal(root: TreeNode?) {
            if (root == null) return
            print(root.value)
            print(",")
            traversal(root.left)
            traversal(root.right)
        }
    }
  • 相关阅读:
    Android ViewGroup使用小结
    背包问题
    u3d demo起步第二章
    三国武将查询系统 //Java 訪问 数据库
    全端project师必备技能汇总
    记一次内存泄漏调试(memory leak)-Driver Monkey
    备战软考(4) 软考下午题攻略
    HDU1392:Surround the Trees(凸包问题)
    Nginx系列(二)--模块化
    《与古为徒与娟娟发屋》:书法家们刻意回避的一个问题:为什么推崇古代平民的作品而忽略当代平民的作品。4星。
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/13818167.html
Copyright © 2011-2022 走看看